From c6f3b0dd470cc1500f049f615b57abf9b2952f30 Mon Sep 17 00:00:00 2001 From: Aaron Turon Date: Mon, 15 Sep 2014 11:00:30 -0700 Subject: [PATCH 01/13] RFC: conventions for placement of unsafe APIs --- active/0000-unsafe-api-location.md | 110 +++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 active/0000-unsafe-api-location.md diff --git a/active/0000-unsafe-api-location.md b/active/0000-unsafe-api-location.md new file mode 100644 index 00000000000..f2823b4cb3f --- /dev/null +++ b/active/0000-unsafe-api-location.md @@ -0,0 +1,110 @@ +- Start Date: (fill me in with today's date, 2014-09-15) +- RFC PR: (leave this empty) +- Rust Issue: (leave this empty) + +# Summary + +This is a *conventions RFC* for settling the location of `unsafe` APIs relative +to the types they work with, as well as the use of `raw` submodules. + +The brief summary is: + +* Unsafe APIs should be made into methods or static functions in the same cases + that safe APIs would be. + +* `raw` submodules should be used only to provide APIs directly on low-level + representations. + +# Motivation + +Many data structures provide unsafe APIs either for avoiding checks or working +directly with their (otherwise private) representation. For example, `string` +provides: + +* An `as_mut_vec` method on `String` that provides a `Vec` view of the + string. This method makes it easy to work with the byte-based representation + of the string, but thereby also allows violation of the utf8 guarantee. + +* A `raw` submodule with a number of free functions, like `from_parts`, that + construct `String` instances from various raw-pointer-based representations, + as well as a `from_utf8` variant that does not actually check for utf8 + validity. + +The problem is that currently, there is no consistent guideline about which of +these APIs should live as methods/static functions associated with a type, and +which should live in a `raw` submodule. Both forms appear throughout the +standard library. + +# Detailed design + +The proposed convention is: + +* When an unsafe function/method is clearly "about" a certain type (as a way of + constructing, destructuring, or modifying values of that type), it should be a + method or static function on that type. This is the same as the convention for + placement of safe functions/methods. + +* When an unsafe function/method is specifically for producing or consuming the + underlying representation of a data structure (which is otherwise private), + the API should use `raw` in its name. Specifically, `from_raw_parts` is the + typical name used for constructing a value from e.g. a pointer-based + representation. + +* When an unsafe function/method is an unchecked variant of an otherwise safe + API, it should be marked using an `_unchecked` suffix. + +* `raw` submodules should only be used to provide APIs directly on low-level + representations, separately from functions/methods for converting to/from such + raw representations. + +The benefit to moving unsafe APIs into methods (resp. static functions) is the +usual one: you can gain easy access to these APIs merely by having a value of +the type (resp. importing the type). + +The perspective here is that marking APIs `unsafe` is enough to deter their use +in ordinary situations; they don't need to be further distinguished by placement +into a separate module. + +# Drawbacks + +One potential drawback of these conventions is that the documentation for a +module will be cluttered with rarely-used `unsafe` APIs, whereas the `raw` +submodule approach neatly groups these APIs. But rustdoc could easily be +changed to either hide or separate out `unsafe` APIs by default. + +More generally, these conventions give `unsafe` APIs more equal status with safe +APIs. Whether this is a *drawback* depends on your philosophy about the status +of unsafe programming. But on a technical level, the key point is that the APIs +are marked `unsafe`, so users still have to opt-in to using them. *Ed note: from +my perspective, low-level/unsafe programming is important to support, and there +is no reason to penalize its ergonomics given that it's opt-in anyway.* + +# Alternatives + +There are two main alternatives: + +* Rather than providing unsafe APIs directly as methods/static functions, they + could be grouped into a single extension trait. For example, the `String` type + could be accompanied by a `StringRaw` extension trait providing APIs for + working with raw string representations. This would allow a clear grouping of + unsafe APIs, while still providing them as methods/static functions and + allowing them to easily be imported with e.g. `use std::string::StringRaw`. + On the other hand, it still further penalizes the raw APIs (beyond marking + them `unsafe`), and given that rustdoc could easily provide API grouping, it's + unclear exactly what the benefit is. + +* Use `raw` submodules to group together *all* manipulation of low-level + representations. No module in `std` currently does this; existing modules + provide some free functions in `raw`, and some unsafe methods, without a clear + driving principle. The ergonomics of moving *everything* into free functions + in a `raw` submodule are quite poor. + +# Unresolved questions + +The `core::raw` module provides structs with public representations equivalent +to several built-in and library types (boxes, closures, slices, etc.). It's not +clear whether the name of this module, or the location of its contents, should +change as a result of this RFC. The module is a special case, because not all of +the types it deals with even have corresponding modules/type declarations -- so +it probably suffices to leave decisions about it to the API stabilization +process. From 643f7692ff76d93ae733226bdaea0aabc2403f80 Mon Sep 17 00:00:00 2001 From: Aaron Turon Date: Mon, 15 Sep 2014 12:53:16 -0700 Subject: [PATCH 02/13] Significant revisions and clarifications --- active/0000-unsafe-api-location.md | 88 +++++++++++++++++++++++------- 1 file changed, 67 insertions(+), 21 deletions(-) diff --git a/active/0000-unsafe-api-location.md b/active/0000-unsafe-api-location.md index f2823b4cb3f..f7d08e27d0a 100644 --- a/active/0000-unsafe-api-location.md +++ b/active/0000-unsafe-api-location.md @@ -12,7 +12,7 @@ The brief summary is: * Unsafe APIs should be made into methods or static functions in the same cases that safe APIs would be. -* `raw` submodules should be used only to provide APIs directly on low-level +* `raw` submodules should be used only to *define* explicit low-level representations. # Motivation @@ -30,10 +30,10 @@ provides: as well as a `from_utf8` variant that does not actually check for utf8 validity. -The problem is that currently, there is no consistent guideline about which of -these APIs should live as methods/static functions associated with a type, and -which should live in a `raw` submodule. Both forms appear throughout the -standard library. +The problem is that currently, there is no clear/consistent guideline about +which of these APIs should live as methods/static functions associated with a +type, and which should live in a `raw` submodule. Both forms appear throughout +the standard library. # Detailed design @@ -42,35 +42,66 @@ The proposed convention is: * When an unsafe function/method is clearly "about" a certain type (as a way of constructing, destructuring, or modifying values of that type), it should be a method or static function on that type. This is the same as the convention for - placement of safe functions/methods. + placement of safe functions/methods. So functions like + `string::raw::from_parts` would become static functions on `String`. -* When an unsafe function/method is specifically for producing or consuming the - underlying representation of a data structure (which is otherwise private), - the API should use `raw` in its name. Specifically, `from_raw_parts` is the - typical name used for constructing a value from e.g. a pointer-based - representation. +* `raw` submodules should only be used to *define* low-level + types/representations (and methods/functions on them). Methods for converting + to/from such low-level types should be available directly on the high-level + types. Examples: `core::raw`, `sync::raw`. -* When an unsafe function/method is an unchecked variant of an otherwise safe - API, it should be marked using an `_unchecked` suffix. +The benefits are: -* `raw` submodules should only be used to provide APIs directly on low-level - representations, separately from functions/methods for converting to/from such - raw representations. +* *Ergonomics*. You can gain easy access to unsafe APIs merely by having a value + of the type (or, for static functions, importing the type). -The benefit to moving unsafe APIs into methods (resp. static functions) is the -usual one: you can gain easy access to these APIs merely by having a value of -the type (resp. importing the type). +* *Consistency and simplicity*. The rules for placement of unsafe APIs are the + same as those for safe APIs. The perspective here is that marking APIs `unsafe` is enough to deter their use in ordinary situations; they don't need to be further distinguished by placement into a separate module. +There are also some naming conventions to go along with unsafe static functions +and methods: + +* When an unsafe function/method is an unchecked variant of an otherwise safe + API, it should be marked using an `_unchecked` suffix. + + For example, the `String` module should provide both `from_utf8` and + `from_utf8_unchecked` constructors, where the latter does not actually check + the utf8 encoding. The `string::raw::slice_bytes` and + `string::raw::slice_unchecked` functions should be merged into a single + `slice_unchecked` method on strings that checks neither bounds nor utf8 + boundaries. + +* When an unsafe function/method produces or consumes a low-level representation + of a data structure, the API should use `raw` in its name. Specifically, + `from_raw_parts` is the typical name used for constructing a value from e.g. a + pointer-based representation. + +* Otherwise, *consider* using a name that suggests *why* the API is unsafe. In + some cases, like `String::as_mut_vec`, other stronger conventions apply, and the + `unsafe` qualifier on the signature (together with API documentation) is + enough. + +The unsafe methods and static functions for a given type should be placed in +their own `impl` block, at the end of the module defining the type; this will +ensure that they are grouped together in rustdoc. (Thanks @kballard for the +suggestion.) + # Drawbacks One potential drawback of these conventions is that the documentation for a module will be cluttered with rarely-used `unsafe` APIs, whereas the `raw` submodule approach neatly groups these APIs. But rustdoc could easily be -changed to either hide or separate out `unsafe` APIs by default. +changed to either hide or separate out `unsafe` APIs by default, and in the +meantime the `impl` block grouping should help. + +More specifically, the convention of placing unsafe constructors in `raw` makes +them very easy to find. But the usual `from_` convention, together with the +naming conventions suggested above, should make it fairly easy to discover such +constructors even when they're supplied directly as static functions. More generally, these conventions give `unsafe` APIs more equal status with safe APIs. Whether this is a *drawback* depends on your philosophy about the status @@ -81,7 +112,7 @@ is no reason to penalize its ergonomics given that it's opt-in anyway.* # Alternatives -There are two main alternatives: +There are a few alternatives: * Rather than providing unsafe APIs directly as methods/static functions, they could be grouped into a single extension trait. For example, the `String` type @@ -93,6 +124,21 @@ There are two main alternatives: them `unsafe`), and given that rustdoc could easily provide API grouping, it's unclear exactly what the benefit is. +* ([Suggested by @kballard](https://github.com/rust-lang/rfcs/pull/240#issuecomment-55635468)): + + > Use `raw` for functions that construct a value of the type without checking + > for one or more invariants. + + The advantage is that it's easy to find such invariant-ignoring functions. The + disadvantage is that their ergonomics is worsened, since they much be + separately imported or referenced through a lengthy path: + + ```rust + // Compare the ergonomics: + string::raw::slice_unchecked(some_string, start, end) + some_string.slice_unchecked(start, end) + ``` + * Use `raw` submodules to group together *all* manipulation of low-level representations. No module in `std` currently does this; existing modules provide some free functions in `raw`, and some unsafe methods, without a clear From 01e9ad93da6c722897f6afb14357f39253ed8752 Mon Sep 17 00:00:00 2001 From: Aaron Turon Date: Mon, 15 Sep 2014 12:57:56 -0700 Subject: [PATCH 03/13] Additional clarification of current state of affairs --- active/0000-unsafe-api-location.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/active/0000-unsafe-api-location.md b/active/0000-unsafe-api-location.md index f7d08e27d0a..ad5b991d082 100644 --- a/active/0000-unsafe-api-location.md +++ b/active/0000-unsafe-api-location.md @@ -26,9 +26,10 @@ provides: of the string, but thereby also allows violation of the utf8 guarantee. * A `raw` submodule with a number of free functions, like `from_parts`, that - construct `String` instances from various raw-pointer-based representations, - as well as a `from_utf8` variant that does not actually check for utf8 - validity. + constructs a `String` instances from a raw-pointer-based representation, a + `from_utf8` variant that does not actually check for utf8 validity, and so + on. The unifying theme is that all of these functions avoid checking some key + invariant. The problem is that currently, there is no clear/consistent guideline about which of these APIs should live as methods/static functions associated with a From 2e00888c9d8744380581304a95d9d29634b030f0 Mon Sep 17 00:00:00 2001 From: Aaron Turon Date: Mon, 15 Sep 2014 15:27:08 -0700 Subject: [PATCH 04/13] Added another alternative from kballard --- active/0000-unsafe-api-location.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/active/0000-unsafe-api-location.md b/active/0000-unsafe-api-location.md index ad5b991d082..2ffe6d6342d 100644 --- a/active/0000-unsafe-api-location.md +++ b/active/0000-unsafe-api-location.md @@ -140,6 +140,11 @@ There are a few alternatives: some_string.slice_unchecked(start, end) ``` +* Another suggestion by @kballard is to keep the basic structure of `raw` + submodules, but use associated types to improve the ergonomics. Details (and + discussions of pros/cons) are in + [this comment](https://github.com/rust-lang/rfcs/pull/240/files#r17572875). + * Use `raw` submodules to group together *all* manipulation of low-level representations. No module in `std` currently does this; existing modules provide some free functions in `raw`, and some unsafe methods, without a clear From fa68ec1bd63638c18020f9775f0cf3e1c3e7b8a4 Mon Sep 17 00:00:00 2001 From: Aaron Turon Date: Tue, 30 Sep 2014 15:07:24 -0700 Subject: [PATCH 05/13] RFC: remove virtual structs --- active/0000-remove-virtual-structs.md | 45 +++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 active/0000-remove-virtual-structs.md diff --git a/active/0000-remove-virtual-structs.md b/active/0000-remove-virtual-structs.md new file mode 100644 index 00000000000..6b50ccbd35c --- /dev/null +++ b/active/0000-remove-virtual-structs.md @@ -0,0 +1,45 @@ +- Start Date: (fill me in with today's date, 2014-09-30) +- RFC PR: (leave this empty) +- Rust Issue: (leave this empty) + +# Summary + +Removes the "virtual struct" (aka struct inheritance) feature, which +is currently feature gated. + +# Motivation + +Virtual structs were added experimentally prior to the RFC process as +a way of inheriting fields from one struct when defining a new struct. + +The feature was introduced and remains behind a feature gate. + +The motivations for removing this feature altogether are: + +1. The feature is likely to be replaced by a more general mechanism, + as part of the need to address hierarchies such as the DOM, ASTs, + and so on. See + [this post](http://discuss.rust-lang.org/t/summary-of-efficient-inheritance-rfcs/494/43) + for some recent discussion. + +2. The implementation is somewhat buggy and incomplete, and the + feature is not well-documented. + +3. Although it's behind a feature gate, keeping the feature around is + still a maintenance burden. + +# Detailed design + +Remove the implementation and feature gate for virtual structs. + +Retain the `virtual` keyword as reserved for possible future use. + +# Drawbacks + +The language will no longer offer any built-in mechanism for avoiding +repetition of struct fields. Macros offer a reasonable workaround +until a more general mechanism is added. + +# Unresolved questions + +None known. From 42c191192ec420b0c32f4813539a91d0702542ad Mon Sep 17 00:00:00 2001 From: Nick Cameron Date: Wed, 1 Oct 2014 11:41:13 +1300 Subject: [PATCH 06/13] Reserve `abstract`, `final`, and `override` as possible keywords. --- 0000-keywords.md | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 0000-keywords.md diff --git a/0000-keywords.md b/0000-keywords.md new file mode 100644 index 00000000000..6168b41346a --- /dev/null +++ b/0000-keywords.md @@ -0,0 +1,35 @@ +- Start Date: (fill me in with today's date, YYYY-MM-DD) +- RFC PR: (leave this empty) +- Rust Issue: (leave this empty) + +# Summary + +Reserve `abstract`, `final`, and `override` as possible keywords. + +# Motivation + +We intend to add some mechanism to Rust to support more efficient inheritance +(see, e.g., RFC PRs #245 and #250, and this +[thread](http://discuss.rust-lang.org/t/summary-of-efficient-inheritance-rfcs/494/43) +on discuss). Although we have not decided how to do this, we do know that we +will. Any implementation is likely to make use of keywords `virtual` (already +used, to remain reserved), `abstract`, `final`, and `override`, so it makes +sense to reserve these now to make the eventual implementation as backwards +compatible as possible. + +# Detailed design + +Make `abstract`, `final`, and `override` reserved keywords. + +# Drawbacks + +Takes a few more words out of the possible vocabulary of Rust programmers. + +# Alternatives + +Don't do this and deal with it when we have an implementation. This would mean +bumping the language version, probably. + +# Unresolved questions + +N/A From df30e2dd4b511ff59c686785505d9aa1f4915be9 Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Tue, 7 Oct 2014 16:16:21 -0700 Subject: [PATCH 07/13] RFC 71 - remove virtual structs --- ...ve-virtual-structs.md => 0071-remove-virtual-structs.md} | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) rename active/{0000-remove-virtual-structs.md => 0071-remove-virtual-structs.md} (89%) diff --git a/active/0000-remove-virtual-structs.md b/active/0071-remove-virtual-structs.md similarity index 89% rename from active/0000-remove-virtual-structs.md rename to active/0071-remove-virtual-structs.md index 6b50ccbd35c..ea7c5a0db8f 100644 --- a/active/0000-remove-virtual-structs.md +++ b/active/0071-remove-virtual-structs.md @@ -1,6 +1,6 @@ -- Start Date: (fill me in with today's date, 2014-09-30) -- RFC PR: (leave this empty) -- Rust Issue: (leave this empty) +- Start Date: 2014-09-30 +- RFC PR: https://github.com/rust-lang/rfcs/pull/341 +- Rust Issue: https://github.com/rust-lang/rust/issues/17861 # Summary From fe84740c83fdd88ca82ec263b8df406d82e348f2 Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Tue, 7 Oct 2014 16:19:28 -0700 Subject: [PATCH 08/13] RFC 72 - reserve some keywords --- 0000-keywords.md => active/0072-keywords.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) rename 0000-keywords.md => active/0072-keywords.md (87%) diff --git a/0000-keywords.md b/active/0072-keywords.md similarity index 87% rename from 0000-keywords.md rename to active/0072-keywords.md index 6168b41346a..a550d908248 100644 --- a/0000-keywords.md +++ b/active/0072-keywords.md @@ -1,6 +1,6 @@ -- Start Date: (fill me in with today's date, YYYY-MM-DD) -- RFC PR: (leave this empty) -- Rust Issue: (leave this empty) +- Start Date: 2014-10-07 +- RFC PR: https://github.com/rust-lang/rfcs/pull/342 +- Rust Issue: https://github.com/rust-lang/rust/issues/17862 # Summary From c7da23aa580282d65ca7504b5b49d974b2290ea8 Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Tue, 7 Oct 2014 16:46:40 -0700 Subject: [PATCH 09/13] RFC 73 - Unsafe API locations --- ...0-unsafe-api-location.md => 0073-unsafe-api-location.md} | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) rename active/{0000-unsafe-api-location.md => 0073-unsafe-api-location.md} (97%) diff --git a/active/0000-unsafe-api-location.md b/active/0073-unsafe-api-location.md similarity index 97% rename from active/0000-unsafe-api-location.md rename to active/0073-unsafe-api-location.md index 2ffe6d6342d..58697bf4616 100644 --- a/active/0000-unsafe-api-location.md +++ b/active/0073-unsafe-api-location.md @@ -1,6 +1,6 @@ -- Start Date: (fill me in with today's date, 2014-09-15) -- RFC PR: (leave this empty) -- Rust Issue: (leave this empty) +- Start Date: 2014-10-07 +- RFC PR: [rust-lang/rfcs#240](https://github.com/rust-lang/rfcs/pull/240) +- Rust Issue: [rust-lang/rust#17863](https://github.com/rust-lang/rust/issues/17863) # Summary From 4009b546172c558a1cfa0f39dd81c896312f73d5 Mon Sep 17 00:00:00 2001 From: "Felix S. Klock II" Date: Wed, 8 Oct 2014 13:27:01 +0200 Subject: [PATCH 10/13] Revise RFC file layout to improve workflow for linking to RFC's. This commit just: * combines the `complete/` and `active/` directories into one: `text/` * renames all of the RFC text files to use their earliest associated PR number as the RFC number. A follow-on commit encodes the `active`/`complete` distinction into a list in the README.md file, and fixes a few mistakes in the RFC files that I encountered along the way. --- complete/0004-private-fields.md => text/0001-private-fields.md | 0 active/0001-rfc-process.md => text/0002-rfc-process.md | 0 complete/0002-attribute-usage.md => text/0003-attribute-usage.md | 0 active/0005-new-intrinsics.md => text/0008-new-intrinsics.md | 0 active/0040-more-attributes.md => text/0016-more-attributes.md | 0 .../0019-opt-in-builtin-traits.md | 0 complete/0006-remove-priv.md => text/0026-remove-priv.md | 0 .../0034-bounded-type-parameters.md | 0 complete/0012-libstd-facade.md => text/0040-libstd-facade.md | 0 complete/0007-regexps.md => text/0042-regexps.md | 0 active/0024-traits.md => text/0048-traits.md | 0 .../0049-match-arm-attributes.md | 0 complete/0015-assert.md => text/0050-assert.md | 0 complete/0014-remove-tilde.md => text/0059-remove-tilde.md | 0 complete/0019-rename-strbuf.md => text/0060-rename-strbuf.md | 0 .../0063-module-file-system-hierarchy.md | 0 .../0066-better-temporary-lifetimes.md | 0 .../0068-const-unsafe-pointers.md | 0 complete/0023-ascii-literals.md => text/0069-ascii-literals.md | 0 .../0017-const-block-expr.md => text/0071-const-block-expr.md | 0 .../0079-undefined-struct-layout.md | 0 complete/0020-pattern-macros.md => text/0085-pattern-macros.md | 0 .../0022-plugin-registrar.md => text/0086-plugin-registrar.md | 0 .../0087-trait-bounds-with-plus.md | 0 complete/0029-loadable-lints.md => text/0089-loadable-lints.md | 0 .../0090-lexical-syntax-simplification.md | 0 complete/0025-struct-grammar.md => text/0092-struct-grammar.md | 0 .../0026-remove-format-intl.md => text/0093-remove-format-intl.md | 0 complete/0028-partial-cmp.md => text/0100-partial-cmp.md | 0 .../0107-pattern-guards-with-bind-by-move.md | 0 complete/0035-remove-crate-id.md => text/0109-remove-crate-id.md | 0 complete/0034-index-traits.md => text/0111-index-traits.md | 0 .../0112-remove-cross-borrowing.md | 0 active/0044-closures.md => text/0114-closures.md | 0 .../0115-rm-integer-fallback.md | 0 .../0116-no-module-shadowing.md | 0 .../0123-share-to-threadsafe.md | 0 complete/0043-box-not-special.md => text/0130-box-not-special.md | 0 .../0131-target-specification.md | 0 active/0046-ufcs.md => text/0132-ufcs.md | 0 active/0066-where.md => text/0135-where.md | 0 .../0136-no-privates-in-public.md | 0 .../0139-remove-cross-borrowing-entirely.md | 0 active/0039-lifetime-elision.md => text/0141-lifetime-elision.md | 0 active/0038-capture-by-value.md => text/0151-capture-by-value.md | 0 .../0155-anonymous-impl-only-in-same-module.md | 0 complete/0051-if-let.md => text/0160-if-let.md | 0 .../0164-feature-gate-slice-pats.md | 0 complete/0041-mod.md => text/0168-mod.md | 0 complete/0047-use-path-as-id.md => text/0169-use-path-as-id.md | 0 complete/0053-tuple-accessors.md => text/0184-tuple-accessors.md | 0 .../0192-bounds-on-object-and-generic-types.md | 0 complete/0065-cfg-syntax.md => text/0194-cfg-syntax.md | 0 active/0059-associated-items.md => text/0195-associated-items.md | 0 active/0058-slice-notation.md => text/0198-slice-notation.md | 0 .../0052-ownership-variants.md => text/0199-ownership-variants.md | 0 active/0070-error-chaining.md => text/0201-error-chaining.md | 0 .../0202-subslice-syntax-change.md | 0 .../0212-restore-int-fallback.md | 0 active/0068-while-let.md => text/0214-while-let.md | 0 active/0060-collection-views.md => text/0216-collection-views.md | 0 active/0064-panic.md => text/0221-panic.md | 0 active/0062-remove-runtime.md => text/0230-remove-runtime.md | 0 .../0231-upvar-capture-inference.md | 0 .../0061-variants-namespace.md => text/0234-variants-namespace.md | 0 .../0240-unsafe-api-location.md | 0 active/0069-const-vs-static.md => text/0246-const-vs-static.md | 0 .../0256-remove-refcounting-gc-of-t.md | 0 .../0341-remove-virtual-structs.md | 0 active/0072-keywords.md => text/0342-keywords.md | 0 70 files changed, 0 insertions(+), 0 deletions(-) rename complete/0004-private-fields.md => text/0001-private-fields.md (100%) rename active/0001-rfc-process.md => text/0002-rfc-process.md (100%) rename complete/0002-attribute-usage.md => text/0003-attribute-usage.md (100%) rename active/0005-new-intrinsics.md => text/0008-new-intrinsics.md (100%) rename active/0040-more-attributes.md => text/0016-more-attributes.md (100%) rename active/0003-opt-in-builtin-traits.md => text/0019-opt-in-builtin-traits.md (100%) rename complete/0006-remove-priv.md => text/0026-remove-priv.md (100%) rename complete/0011-bounded-type-parameters.md => text/0034-bounded-type-parameters.md (100%) rename complete/0012-libstd-facade.md => text/0040-libstd-facade.md (100%) rename complete/0007-regexps.md => text/0042-regexps.md (100%) rename active/0024-traits.md => text/0048-traits.md (100%) rename complete/0008-match-arm-attributes.md => text/0049-match-arm-attributes.md (100%) rename complete/0015-assert.md => text/0050-assert.md (100%) rename complete/0014-remove-tilde.md => text/0059-remove-tilde.md (100%) rename complete/0019-rename-strbuf.md => text/0060-rename-strbuf.md (100%) rename complete/0016-module-file-system-hierarchy.md => text/0063-module-file-system-hierarchy.md (100%) rename active/0031-better-temporary-lifetimes.md => text/0066-better-temporary-lifetimes.md (100%) rename complete/0032-const-unsafe-pointers.md => text/0068-const-unsafe-pointers.md (100%) rename complete/0023-ascii-literals.md => text/0069-ascii-literals.md (100%) rename complete/0017-const-block-expr.md => text/0071-const-block-expr.md (100%) rename complete/0018-undefined-struct-layout.md => text/0079-undefined-struct-layout.md (100%) rename complete/0020-pattern-macros.md => text/0085-pattern-macros.md (100%) rename complete/0022-plugin-registrar.md => text/0086-plugin-registrar.md (100%) rename complete/0027-trait-bounds-with-plus.md => text/0087-trait-bounds-with-plus.md (100%) rename complete/0029-loadable-lints.md => text/0089-loadable-lints.md (100%) rename active/0021-lexical-syntax-simplification.md => text/0090-lexical-syntax-simplification.md (100%) rename complete/0025-struct-grammar.md => text/0092-struct-grammar.md (100%) rename complete/0026-remove-format-intl.md => text/0093-remove-format-intl.md (100%) rename complete/0028-partial-cmp.md => text/0100-partial-cmp.md (100%) rename active/0036-pattern-guards-with-bind-by-move.md => text/0107-pattern-guards-with-bind-by-move.md (100%) rename complete/0035-remove-crate-id.md => text/0109-remove-crate-id.md (100%) rename complete/0034-index-traits.md => text/0111-index-traits.md (100%) rename complete/0033-remove-cross-borrowing.md => text/0112-remove-cross-borrowing.md (100%) rename active/0044-closures.md => text/0114-closures.md (100%) rename complete/0030-rm-integer-fallback.md => text/0115-rm-integer-fallback.md (100%) rename complete/0050-no-module-shadowing.md => text/0116-no-module-shadowing.md (100%) rename complete/0045-share-to-threadsafe.md => text/0123-share-to-threadsafe.md (100%) rename complete/0043-box-not-special.md => text/0130-box-not-special.md (100%) rename active/0042-target-specification.md => text/0131-target-specification.md (100%) rename active/0046-ufcs.md => text/0132-ufcs.md (100%) rename active/0066-where.md => text/0135-where.md (100%) rename complete/0048-no-privates-in-public.md => text/0136-no-privates-in-public.md (100%) rename complete/0037-remove-cross-borrowing-entirely.md => text/0139-remove-cross-borrowing-entirely.md (100%) rename active/0039-lifetime-elision.md => text/0141-lifetime-elision.md (100%) rename active/0038-capture-by-value.md => text/0151-capture-by-value.md (100%) rename complete/0057-anonymous-impl-only-in-same-module.md => text/0155-anonymous-impl-only-in-same-module.md (100%) rename complete/0051-if-let.md => text/0160-if-let.md (100%) rename complete/0054-feature-gate-slice-pats.md => text/0164-feature-gate-slice-pats.md (100%) rename complete/0041-mod.md => text/0168-mod.md (100%) rename complete/0047-use-path-as-id.md => text/0169-use-path-as-id.md (100%) rename complete/0053-tuple-accessors.md => text/0184-tuple-accessors.md (100%) rename complete/0049-bounds-on-object-and-generic-types.md => text/0192-bounds-on-object-and-generic-types.md (100%) rename complete/0065-cfg-syntax.md => text/0194-cfg-syntax.md (100%) rename active/0059-associated-items.md => text/0195-associated-items.md (100%) rename active/0058-slice-notation.md => text/0198-slice-notation.md (100%) rename active/0052-ownership-variants.md => text/0199-ownership-variants.md (100%) rename active/0070-error-chaining.md => text/0201-error-chaining.md (100%) rename complete/0055-subslice-syntax-change.md => text/0202-subslice-syntax-change.md (100%) rename active/0056-restore-int-fallback.md => text/0212-restore-int-fallback.md (100%) rename active/0068-while-let.md => text/0214-while-let.md (100%) rename active/0060-collection-views.md => text/0216-collection-views.md (100%) rename active/0064-panic.md => text/0221-panic.md (100%) rename active/0062-remove-runtime.md => text/0230-remove-runtime.md (100%) rename active/0063-upvar-capture-inference.md => text/0231-upvar-capture-inference.md (100%) rename complete/0061-variants-namespace.md => text/0234-variants-namespace.md (100%) rename active/0073-unsafe-api-location.md => text/0240-unsafe-api-location.md (100%) rename active/0069-const-vs-static.md => text/0246-const-vs-static.md (100%) rename complete/0067-remove-refcounting-gc-of-t.md => text/0256-remove-refcounting-gc-of-t.md (100%) rename active/0071-remove-virtual-structs.md => text/0341-remove-virtual-structs.md (100%) rename active/0072-keywords.md => text/0342-keywords.md (100%) diff --git a/complete/0004-private-fields.md b/text/0001-private-fields.md similarity index 100% rename from complete/0004-private-fields.md rename to text/0001-private-fields.md diff --git a/active/0001-rfc-process.md b/text/0002-rfc-process.md similarity index 100% rename from active/0001-rfc-process.md rename to text/0002-rfc-process.md diff --git a/complete/0002-attribute-usage.md b/text/0003-attribute-usage.md similarity index 100% rename from complete/0002-attribute-usage.md rename to text/0003-attribute-usage.md diff --git a/active/0005-new-intrinsics.md b/text/0008-new-intrinsics.md similarity index 100% rename from active/0005-new-intrinsics.md rename to text/0008-new-intrinsics.md diff --git a/active/0040-more-attributes.md b/text/0016-more-attributes.md similarity index 100% rename from active/0040-more-attributes.md rename to text/0016-more-attributes.md diff --git a/active/0003-opt-in-builtin-traits.md b/text/0019-opt-in-builtin-traits.md similarity index 100% rename from active/0003-opt-in-builtin-traits.md rename to text/0019-opt-in-builtin-traits.md diff --git a/complete/0006-remove-priv.md b/text/0026-remove-priv.md similarity index 100% rename from complete/0006-remove-priv.md rename to text/0026-remove-priv.md diff --git a/complete/0011-bounded-type-parameters.md b/text/0034-bounded-type-parameters.md similarity index 100% rename from complete/0011-bounded-type-parameters.md rename to text/0034-bounded-type-parameters.md diff --git a/complete/0012-libstd-facade.md b/text/0040-libstd-facade.md similarity index 100% rename from complete/0012-libstd-facade.md rename to text/0040-libstd-facade.md diff --git a/complete/0007-regexps.md b/text/0042-regexps.md similarity index 100% rename from complete/0007-regexps.md rename to text/0042-regexps.md diff --git a/active/0024-traits.md b/text/0048-traits.md similarity index 100% rename from active/0024-traits.md rename to text/0048-traits.md diff --git a/complete/0008-match-arm-attributes.md b/text/0049-match-arm-attributes.md similarity index 100% rename from complete/0008-match-arm-attributes.md rename to text/0049-match-arm-attributes.md diff --git a/complete/0015-assert.md b/text/0050-assert.md similarity index 100% rename from complete/0015-assert.md rename to text/0050-assert.md diff --git a/complete/0014-remove-tilde.md b/text/0059-remove-tilde.md similarity index 100% rename from complete/0014-remove-tilde.md rename to text/0059-remove-tilde.md diff --git a/complete/0019-rename-strbuf.md b/text/0060-rename-strbuf.md similarity index 100% rename from complete/0019-rename-strbuf.md rename to text/0060-rename-strbuf.md diff --git a/complete/0016-module-file-system-hierarchy.md b/text/0063-module-file-system-hierarchy.md similarity index 100% rename from complete/0016-module-file-system-hierarchy.md rename to text/0063-module-file-system-hierarchy.md diff --git a/active/0031-better-temporary-lifetimes.md b/text/0066-better-temporary-lifetimes.md similarity index 100% rename from active/0031-better-temporary-lifetimes.md rename to text/0066-better-temporary-lifetimes.md diff --git a/complete/0032-const-unsafe-pointers.md b/text/0068-const-unsafe-pointers.md similarity index 100% rename from complete/0032-const-unsafe-pointers.md rename to text/0068-const-unsafe-pointers.md diff --git a/complete/0023-ascii-literals.md b/text/0069-ascii-literals.md similarity index 100% rename from complete/0023-ascii-literals.md rename to text/0069-ascii-literals.md diff --git a/complete/0017-const-block-expr.md b/text/0071-const-block-expr.md similarity index 100% rename from complete/0017-const-block-expr.md rename to text/0071-const-block-expr.md diff --git a/complete/0018-undefined-struct-layout.md b/text/0079-undefined-struct-layout.md similarity index 100% rename from complete/0018-undefined-struct-layout.md rename to text/0079-undefined-struct-layout.md diff --git a/complete/0020-pattern-macros.md b/text/0085-pattern-macros.md similarity index 100% rename from complete/0020-pattern-macros.md rename to text/0085-pattern-macros.md diff --git a/complete/0022-plugin-registrar.md b/text/0086-plugin-registrar.md similarity index 100% rename from complete/0022-plugin-registrar.md rename to text/0086-plugin-registrar.md diff --git a/complete/0027-trait-bounds-with-plus.md b/text/0087-trait-bounds-with-plus.md similarity index 100% rename from complete/0027-trait-bounds-with-plus.md rename to text/0087-trait-bounds-with-plus.md diff --git a/complete/0029-loadable-lints.md b/text/0089-loadable-lints.md similarity index 100% rename from complete/0029-loadable-lints.md rename to text/0089-loadable-lints.md diff --git a/active/0021-lexical-syntax-simplification.md b/text/0090-lexical-syntax-simplification.md similarity index 100% rename from active/0021-lexical-syntax-simplification.md rename to text/0090-lexical-syntax-simplification.md diff --git a/complete/0025-struct-grammar.md b/text/0092-struct-grammar.md similarity index 100% rename from complete/0025-struct-grammar.md rename to text/0092-struct-grammar.md diff --git a/complete/0026-remove-format-intl.md b/text/0093-remove-format-intl.md similarity index 100% rename from complete/0026-remove-format-intl.md rename to text/0093-remove-format-intl.md diff --git a/complete/0028-partial-cmp.md b/text/0100-partial-cmp.md similarity index 100% rename from complete/0028-partial-cmp.md rename to text/0100-partial-cmp.md diff --git a/active/0036-pattern-guards-with-bind-by-move.md b/text/0107-pattern-guards-with-bind-by-move.md similarity index 100% rename from active/0036-pattern-guards-with-bind-by-move.md rename to text/0107-pattern-guards-with-bind-by-move.md diff --git a/complete/0035-remove-crate-id.md b/text/0109-remove-crate-id.md similarity index 100% rename from complete/0035-remove-crate-id.md rename to text/0109-remove-crate-id.md diff --git a/complete/0034-index-traits.md b/text/0111-index-traits.md similarity index 100% rename from complete/0034-index-traits.md rename to text/0111-index-traits.md diff --git a/complete/0033-remove-cross-borrowing.md b/text/0112-remove-cross-borrowing.md similarity index 100% rename from complete/0033-remove-cross-borrowing.md rename to text/0112-remove-cross-borrowing.md diff --git a/active/0044-closures.md b/text/0114-closures.md similarity index 100% rename from active/0044-closures.md rename to text/0114-closures.md diff --git a/complete/0030-rm-integer-fallback.md b/text/0115-rm-integer-fallback.md similarity index 100% rename from complete/0030-rm-integer-fallback.md rename to text/0115-rm-integer-fallback.md diff --git a/complete/0050-no-module-shadowing.md b/text/0116-no-module-shadowing.md similarity index 100% rename from complete/0050-no-module-shadowing.md rename to text/0116-no-module-shadowing.md diff --git a/complete/0045-share-to-threadsafe.md b/text/0123-share-to-threadsafe.md similarity index 100% rename from complete/0045-share-to-threadsafe.md rename to text/0123-share-to-threadsafe.md diff --git a/complete/0043-box-not-special.md b/text/0130-box-not-special.md similarity index 100% rename from complete/0043-box-not-special.md rename to text/0130-box-not-special.md diff --git a/active/0042-target-specification.md b/text/0131-target-specification.md similarity index 100% rename from active/0042-target-specification.md rename to text/0131-target-specification.md diff --git a/active/0046-ufcs.md b/text/0132-ufcs.md similarity index 100% rename from active/0046-ufcs.md rename to text/0132-ufcs.md diff --git a/active/0066-where.md b/text/0135-where.md similarity index 100% rename from active/0066-where.md rename to text/0135-where.md diff --git a/complete/0048-no-privates-in-public.md b/text/0136-no-privates-in-public.md similarity index 100% rename from complete/0048-no-privates-in-public.md rename to text/0136-no-privates-in-public.md diff --git a/complete/0037-remove-cross-borrowing-entirely.md b/text/0139-remove-cross-borrowing-entirely.md similarity index 100% rename from complete/0037-remove-cross-borrowing-entirely.md rename to text/0139-remove-cross-borrowing-entirely.md diff --git a/active/0039-lifetime-elision.md b/text/0141-lifetime-elision.md similarity index 100% rename from active/0039-lifetime-elision.md rename to text/0141-lifetime-elision.md diff --git a/active/0038-capture-by-value.md b/text/0151-capture-by-value.md similarity index 100% rename from active/0038-capture-by-value.md rename to text/0151-capture-by-value.md diff --git a/complete/0057-anonymous-impl-only-in-same-module.md b/text/0155-anonymous-impl-only-in-same-module.md similarity index 100% rename from complete/0057-anonymous-impl-only-in-same-module.md rename to text/0155-anonymous-impl-only-in-same-module.md diff --git a/complete/0051-if-let.md b/text/0160-if-let.md similarity index 100% rename from complete/0051-if-let.md rename to text/0160-if-let.md diff --git a/complete/0054-feature-gate-slice-pats.md b/text/0164-feature-gate-slice-pats.md similarity index 100% rename from complete/0054-feature-gate-slice-pats.md rename to text/0164-feature-gate-slice-pats.md diff --git a/complete/0041-mod.md b/text/0168-mod.md similarity index 100% rename from complete/0041-mod.md rename to text/0168-mod.md diff --git a/complete/0047-use-path-as-id.md b/text/0169-use-path-as-id.md similarity index 100% rename from complete/0047-use-path-as-id.md rename to text/0169-use-path-as-id.md diff --git a/complete/0053-tuple-accessors.md b/text/0184-tuple-accessors.md similarity index 100% rename from complete/0053-tuple-accessors.md rename to text/0184-tuple-accessors.md diff --git a/complete/0049-bounds-on-object-and-generic-types.md b/text/0192-bounds-on-object-and-generic-types.md similarity index 100% rename from complete/0049-bounds-on-object-and-generic-types.md rename to text/0192-bounds-on-object-and-generic-types.md diff --git a/complete/0065-cfg-syntax.md b/text/0194-cfg-syntax.md similarity index 100% rename from complete/0065-cfg-syntax.md rename to text/0194-cfg-syntax.md diff --git a/active/0059-associated-items.md b/text/0195-associated-items.md similarity index 100% rename from active/0059-associated-items.md rename to text/0195-associated-items.md diff --git a/active/0058-slice-notation.md b/text/0198-slice-notation.md similarity index 100% rename from active/0058-slice-notation.md rename to text/0198-slice-notation.md diff --git a/active/0052-ownership-variants.md b/text/0199-ownership-variants.md similarity index 100% rename from active/0052-ownership-variants.md rename to text/0199-ownership-variants.md diff --git a/active/0070-error-chaining.md b/text/0201-error-chaining.md similarity index 100% rename from active/0070-error-chaining.md rename to text/0201-error-chaining.md diff --git a/complete/0055-subslice-syntax-change.md b/text/0202-subslice-syntax-change.md similarity index 100% rename from complete/0055-subslice-syntax-change.md rename to text/0202-subslice-syntax-change.md diff --git a/active/0056-restore-int-fallback.md b/text/0212-restore-int-fallback.md similarity index 100% rename from active/0056-restore-int-fallback.md rename to text/0212-restore-int-fallback.md diff --git a/active/0068-while-let.md b/text/0214-while-let.md similarity index 100% rename from active/0068-while-let.md rename to text/0214-while-let.md diff --git a/active/0060-collection-views.md b/text/0216-collection-views.md similarity index 100% rename from active/0060-collection-views.md rename to text/0216-collection-views.md diff --git a/active/0064-panic.md b/text/0221-panic.md similarity index 100% rename from active/0064-panic.md rename to text/0221-panic.md diff --git a/active/0062-remove-runtime.md b/text/0230-remove-runtime.md similarity index 100% rename from active/0062-remove-runtime.md rename to text/0230-remove-runtime.md diff --git a/active/0063-upvar-capture-inference.md b/text/0231-upvar-capture-inference.md similarity index 100% rename from active/0063-upvar-capture-inference.md rename to text/0231-upvar-capture-inference.md diff --git a/complete/0061-variants-namespace.md b/text/0234-variants-namespace.md similarity index 100% rename from complete/0061-variants-namespace.md rename to text/0234-variants-namespace.md diff --git a/active/0073-unsafe-api-location.md b/text/0240-unsafe-api-location.md similarity index 100% rename from active/0073-unsafe-api-location.md rename to text/0240-unsafe-api-location.md diff --git a/active/0069-const-vs-static.md b/text/0246-const-vs-static.md similarity index 100% rename from active/0069-const-vs-static.md rename to text/0246-const-vs-static.md diff --git a/complete/0067-remove-refcounting-gc-of-t.md b/text/0256-remove-refcounting-gc-of-t.md similarity index 100% rename from complete/0067-remove-refcounting-gc-of-t.md rename to text/0256-remove-refcounting-gc-of-t.md diff --git a/active/0071-remove-virtual-structs.md b/text/0341-remove-virtual-structs.md similarity index 100% rename from active/0071-remove-virtual-structs.md rename to text/0341-remove-virtual-structs.md diff --git a/active/0072-keywords.md b/text/0342-keywords.md similarity index 100% rename from active/0072-keywords.md rename to text/0342-keywords.md From f9f030ec7d68d9ebe967d90dbf25e26fd37223d9 Mon Sep 17 00:00:00 2001 From: "Felix S. Klock II" Date: Wed, 8 Oct 2014 13:38:33 +0200 Subject: [PATCH 11/13] Fixed typos and format inconsistencies in headers of various RFCs. In particular: * The RFC associated with #127 should have had a link to #19 as well (and has been assigned RFC #19); it also was revised to match the markdown href style of other RFCs. * RFC #34 needed its header entries filled in, * RFC #123 had a typo in its header, and * RC #155 was revised to match the markdown href style of other RFCs. --- text/0019-opt-in-builtin-traits.md | 4 ++-- text/0034-bounded-type-parameters.md | 4 ++-- text/0123-share-to-threadsafe.md | 2 +- text/0155-anonymous-impl-only-in-same-module.md | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/text/0019-opt-in-builtin-traits.md b/text/0019-opt-in-builtin-traits.md index ae4ab261e93..c29e0356326 100644 --- a/text/0019-opt-in-builtin-traits.md +++ b/text/0019-opt-in-builtin-traits.md @@ -1,6 +1,6 @@ - Start Date: 2014-09-18 -- RFC PR #: #127 -- Rust Issue #: #13231 +- RFC PR #: [rust-lang/rfcs#19](https://github.com/rust-lang/rfcs/pull/19), [rust-lang/rfcs#127](https://github.com/rust-lang/rfcs/pull/127) +- Rust Issue #: [rust-lang/rust#13231](https://github.com/rust-lang/rust/issues/13231) # Summary diff --git a/text/0034-bounded-type-parameters.md b/text/0034-bounded-type-parameters.md index aaaaf6bdb88..96504d94336 100644 --- a/text/0034-bounded-type-parameters.md +++ b/text/0034-bounded-type-parameters.md @@ -1,6 +1,6 @@ - Start Date: 2014-04-05 -- RFC PR: -- Rust Issue: +- RFC PR: [rust-lang/rfcs#34](https://github.com/rust-lang/rfcs/pull/34) +- Rust Issue: [rust-lang/rust#15759](https://github.com/rust-lang/rust/issues/15759) # Summary diff --git a/text/0123-share-to-threadsafe.md b/text/0123-share-to-threadsafe.md index 5b3422d479c..0d8739d7748 100644 --- a/text/0123-share-to-threadsafe.md +++ b/text/0123-share-to-threadsafe.md @@ -1,5 +1,5 @@ - Start Date: 2014-06-15 -- RFC PR #: [rust-lang/rfcs#123](https://github.com/rust-lang/rfcs/pull/123j) +- RFC PR #: [rust-lang/rfcs#123](https://github.com/rust-lang/rfcs/pull/123) - Rust Issue #: [rust-lang/rust#16281](https://github.com/rust-lang/rust/issues/16281) # Summary diff --git a/text/0155-anonymous-impl-only-in-same-module.md b/text/0155-anonymous-impl-only-in-same-module.md index 065dc8a86af..8bc961ec716 100644 --- a/text/0155-anonymous-impl-only-in-same-module.md +++ b/text/0155-anonymous-impl-only-in-same-module.md @@ -1,6 +1,6 @@ - Start Date: 2014-07-04 -- RFC PR #: 155 -- Rust Issue #: 17059 +- RFC PR #: [rust-lang/rfcs#155](https://github.com/rust-lang/rfcs/pull/155) +- Rust Issue #: [rust-lang/rust#17059](https://github.com/rust-lang/rust/issues/17059) # Summary From 71eb49d56bbb4d15b0b0f0e9cbd0cc8f9ed7a136 Mon Sep 17 00:00:00 2001 From: "Felix S. Klock II" Date: Wed, 8 Oct 2014 13:41:09 +0200 Subject: [PATCH 12/13] Revised README.md to contain a list of the active RFCs. Added a table-of-contents in the hopes that will ease navigation: the document now starts off with the active list after the introduction, so I anticipate that one will not see as much of the expository text as one used to, and thus the table of contents will help someone who is skimming to find their objective. --- README.md | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 21ed55020c1..fd9a0bf2c9e 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,7 @@ # Rust RFCs +[Rust RFCs]: #rust-rfcs + +(jump forward to: [Table of Contents], [Active RFC List]) Many changes, including bug fixes and documentation improvements can be implemented and reviewed via the normal GitHub pull request workflow. @@ -12,7 +15,54 @@ consistent and controlled path for new features to enter the language and standard libraries, so that all stakeholders can be confident about the direction the language is evolving in. +## Active RFC List +[Active RFC List]: #active-rfc-list + +* [0002-rfc-process.md](text/0002-rfc-process.md) +* [0008-new-intrinsics.md](text/0008-new-intrinsics.md) +* [0016-more-attributes.md](text/0016-more-attributes.md) +* [0019-opt-in-builtin-traits.md](text/0019-opt-in-builtin-traits.md) +* [0048-traits.md](text/0048-traits.md) +* [0066-better-temporary-lifetimes.md](text/0066-better-temporary-lifetimes.md) +* [0090-lexical-syntax-simplification.md](text/0090-lexical-syntax-simplification.md) +* [0107-pattern-guards-with-bind-by-move.md](text/0107-pattern-guards-with-bind-by-move.md) +* [0114-closures.md](text/0114-closures.md) +* [0131-target-specification.md](text/0131-target-specification.md) +* [0132-ufcs.md](text/0132-ufcs.md) +* [0135-where.md](text/0135-where.md) +* [0141-lifetime-elision.md](text/0141-lifetime-elision.md) +* [0151-capture-by-value.md](text/0151-capture-by-value.md) +* [0195-associated-items.md](text/0195-associated-items.md) +* [0198-slice-notation.md](text/0198-slice-notation.md) +* [0199-ownership-variants.md](text/0199-ownership-variants.md) +* [0201-error-chaining.md](text/0201-error-chaining.md) +* [0212-restore-int-fallback.md](text/0212-restore-int-fallback.md) +* [0214-while-let.md](text/0214-while-let.md) +* [0216-collection-views.md](text/0216-collection-views.md) +* [0221-panic.md](text/0221-panic.md) +* [0230-remove-runtime.md](text/0230-remove-runtime.md) +* [0231-upvar-capture-inference.md](text/0231-upvar-capture-inference.md) +* [0240-unsafe-api-location.md](text/0240-unsafe-api-location.md) +* [0246-const-vs-static.md](text/0246-const-vs-static.md) +* [0341-remove-virtual-structs.md](text/0341-remove-virtual-structs.md) +* [0342-keywords.md](text/0342-keywords.md) + +## Table of Contents +[Table of Contents]: #table-of-contents +* [Opening](#rust-rfcs) +* [Active RFC List] +* [Table of Contents] +* [When you need to follow this process] +* [What the process is] +* [The role of the shepherd] +* [The RFC life-cycle] +* [Implementing an RFC] +* [Reviewing RFC's] +* [RFC Postponement] +* [Help this is all too informal!] + ## When you need to follow this process +[When you need to follow this process]: #when-you-need-to-follow-this-process You need to follow this process if you intend to make "substantial" changes to the Rust distribution. What constitutes a "substantial" @@ -39,7 +89,7 @@ through the RFC process, it may be closed with a polite request to submit an RFC first. ## What the process is - +[What the process is]: #what-the-process-is In short, to get a major feature added to Rust, one must first get the RFC merged into the RFC repo as a markdown file. At that point the RFC is 'active' and may be implemented with the goal of eventual inclusion @@ -62,6 +112,7 @@ merging the pull request and assigning the RFC a number, at which point the RFC is 'active', or reject it by closing the pull request. ## The role of the shepherd +[The role of the shepherd]: the-role-of-the-shepherd During triage, every RFC will either be closed or assigned a shepherd. The role of the shepherd is to move the RFC through the process. This @@ -74,6 +125,7 @@ here is to "front-load" as much of the feedback as possible before the point where we actually reach a decision. ## The RFC life-cycle +[The RFC life-cycle]: #the-rfc-life-cycle Once an RFC becomes active then authors may implement it and submit the feature as a pull request to the Rust repo. An 'active' is not a rubber @@ -100,6 +152,7 @@ that fails after becoming active is 'inactive' and moves to the 'inactive' folder. ## Implementing an RFC +[Implementing an RFC]: #implementing-an-rfc Some accepted RFC's represent vital features that need to be implemented right away. Other accepted RFC's can represent features @@ -118,6 +171,7 @@ RFC, but cannot determine if someone else is already working on it, feel free to ask (e.g. by leaving a comment on the associated issue). ## Reviewing RFC's +[Reviewing RFC's]: #reviewing-rfcs Each week the [core team] will attempt to review some set of open RFC pull requests. The choice of pull requests to review is largely @@ -144,6 +198,7 @@ should act as a "shepherd" for the feature. The shepherd need not its virtues and the community’s desire for it. ## RFC Postponement +[RFC Postponement]: #rfc-postponement Some RFC pull requests are tagged with the 'postponed' label when they are closed (as part of the rejection process). An RFC closed with @@ -161,6 +216,7 @@ response is to close the RFC, not postpone it.) ### Help this is all too informal! +[Help this is all too informal!]: #help-this-is-all-too-informal The process is intended to be as lightweight as reasonable for the present circumstances. As usual, we are trying to let the process be From 136bf75c5bba6c2865d52d9b21f46b642d058f01 Mon Sep 17 00:00:00 2001 From: "Felix S. Klock II" Date: Wed, 8 Oct 2014 13:53:44 +0200 Subject: [PATCH 13/13] Update RFC Process document with procedure one follows with new dir layout. --- text/0002-rfc-process.md | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/text/0002-rfc-process.md b/text/0002-rfc-process.md index 86f7e8bf814..4bd0c1f02a8 100644 --- a/text/0002-rfc-process.md +++ b/text/0002-rfc-process.md @@ -61,7 +61,7 @@ is 'active' and may be implemented with the goal of eventual inclusion into Rust. * Fork the RFC repo https://github.com/rust-lang/rfcs -* Copy `0000-template.md` to `active/0000-my-feature.md` (where +* Copy `0000-template.md` to `text/0000-my-feature.md` (where 'my-feature' is descriptive. don't assign an RFC number yet). * Fill in the RFC * Submit a pull request. The pull request is the time to get review of @@ -71,16 +71,19 @@ are much more likely to make progress than those that don't receive any comments. Eventually, somebody on the [core team] will either accept the RFC by -merging the pull request and assigning the RFC a number, at which point -the RFC is 'active', or reject it by closing the pull request. +merging the pull request, at which point the RFC is 'active', or +reject it by closing the pull request. Whomever merges the RFC should do the following: -* Assign a sequential id. -* Add the file in the active directory. -* Create a corresponding issue on Rust. -* Fill in the remaining metadata in the RFC header, including the original - PR # and Rust issue #. +* Assign an id, using the PR number of the RFC pull request. (If the RFC + has multiple pull requests associated with it, choose one PR number, + preferably the minimal one.) +* Add the file in the `text/` directory. +* Create a corresponding issue on [Rust repo](https://github.com/rust-lang/rust) +* Fill in the remaining metadata in the RFC header, including links for + the original pull request(s) and the newly created Rust issue. +* Add an entry in the [Active RFC List] of the root `README.md`. * Commit everything. Once an RFC becomes active then authors may implement it and submit the @@ -91,9 +94,11 @@ have agreed to the feature and are amenable to merging it. Modifications to active RFC's can be done in followup PR's. An RFC that makes it through the entire process to implementation is considered -'complete' and is moved to the 'complete' folder; an RFC that fails +'complete' and is removed from the [Active RFC List]; an RFC that fails after becoming active is 'inactive' and moves to the 'inactive' folder. +[Active RFC List]: ../README.md#active-rfc-list + # Alternatives Retain the current informal RFC process. The newly proposed RFC process is