| <!DOCTYPE HTML> |
| <html lang="en" class="light sidebar-visible" dir="ltr"> |
| <head> |
| <!-- Book generated using mdBook --> |
| <meta charset="UTF-8"> |
| <title>Contribution procedures - Rust Compiler Development Guide</title> |
| |
| |
| <!-- Custom HTML head --> |
| |
| <meta name="description" content="A guide to developing the Rust compiler (rustc)"> |
| <meta name="viewport" content="width=device-width, initial-scale=1"> |
| <meta name="theme-color" content="#ffffff"> |
| |
| <link rel="icon" href="favicon.svg"> |
| <link rel="shortcut icon" href="favicon.png"> |
| <link rel="stylesheet" href="css/variables.css"> |
| <link rel="stylesheet" href="css/general.css"> |
| <link rel="stylesheet" href="css/chrome.css"> |
| <link rel="stylesheet" href="css/print.css" media="print"> |
| |
| <!-- Fonts --> |
| <link rel="stylesheet" href="FontAwesome/css/font-awesome.css"> |
| <link rel="stylesheet" href="fonts/fonts.css"> |
| |
| <!-- Highlight.js Stylesheets --> |
| <link rel="stylesheet" id="highlight-css" href="highlight.css"> |
| <link rel="stylesheet" id="tomorrow-night-css" href="tomorrow-night.css"> |
| <link rel="stylesheet" id="ayu-highlight-css" href="ayu-highlight.css"> |
| |
| <!-- Custom theme stylesheets --> |
| |
| |
| <!-- Provide site root and default themes to javascript --> |
| <script> |
| const path_to_root = ""; |
| const default_light_theme = "light"; |
| const default_dark_theme = "navy"; |
| </script> |
| <!-- Start loading toc.js asap --> |
| <script src="toc.js"></script> |
| </head> |
| <body> |
| <div id="body-container"> |
| <!-- Work around some values being stored in localStorage wrapped in quotes --> |
| <script> |
| try { |
| let theme = localStorage.getItem('mdbook-theme'); |
| let sidebar = localStorage.getItem('mdbook-sidebar'); |
| |
| if (theme.startsWith('"') && theme.endsWith('"')) { |
| localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1)); |
| } |
| |
| if (sidebar.startsWith('"') && sidebar.endsWith('"')) { |
| localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1)); |
| } |
| } catch (e) { } |
| </script> |
| |
| <!-- Set the theme before any content is loaded, prevents flash --> |
| <script> |
| const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme; |
| let theme; |
| try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { } |
| if (theme === null || theme === undefined) { theme = default_theme; } |
| const html = document.documentElement; |
| html.classList.remove('light') |
| html.classList.add(theme); |
| html.classList.add("js"); |
| </script> |
| |
| <input type="checkbox" id="sidebar-toggle-anchor" class="hidden"> |
| |
| <!-- Hide / unhide sidebar before it is displayed --> |
| <script> |
| let sidebar = null; |
| const sidebar_toggle = document.getElementById("sidebar-toggle-anchor"); |
| if (document.body.clientWidth >= 1080) { |
| try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { } |
| sidebar = sidebar || 'visible'; |
| } else { |
| sidebar = 'hidden'; |
| } |
| sidebar_toggle.checked = sidebar === 'visible'; |
| html.classList.remove('sidebar-visible'); |
| html.classList.add("sidebar-" + sidebar); |
| </script> |
| |
| <nav id="sidebar" class="sidebar" aria-label="Table of contents"> |
| <!-- populated by js --> |
| <mdbook-sidebar-scrollbox class="sidebar-scrollbox"></mdbook-sidebar-scrollbox> |
| <noscript> |
| <iframe class="sidebar-iframe-outer" src="toc.html"></iframe> |
| </noscript> |
| <div id="sidebar-resize-handle" class="sidebar-resize-handle"> |
| <div class="sidebar-resize-indicator"></div> |
| </div> |
| </nav> |
| |
| <div id="page-wrapper" class="page-wrapper"> |
| |
| <div class="page"> |
| <div id="menu-bar-hover-placeholder"></div> |
| <div id="menu-bar" class="menu-bar sticky"> |
| <div class="left-buttons"> |
| <label id="sidebar-toggle" class="icon-button" for="sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar"> |
| <i class="fa fa-bars"></i> |
| </label> |
| <button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list"> |
| <i class="fa fa-paint-brush"></i> |
| </button> |
| <ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu"> |
| <li role="none"><button role="menuitem" class="theme" id="default_theme">Auto</button></li> |
| <li role="none"><button role="menuitem" class="theme" id="light">Light</button></li> |
| <li role="none"><button role="menuitem" class="theme" id="rust">Rust</button></li> |
| <li role="none"><button role="menuitem" class="theme" id="coal">Coal</button></li> |
| <li role="none"><button role="menuitem" class="theme" id="navy">Navy</button></li> |
| <li role="none"><button role="menuitem" class="theme" id="ayu">Ayu</button></li> |
| </ul> |
| <button id="search-toggle" class="icon-button" type="button" title="Search. (Shortkey: s)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="S" aria-controls="searchbar"> |
| <i class="fa fa-search"></i> |
| </button> |
| </div> |
| |
| <h1 class="menu-title">Rust Compiler Development Guide</h1> |
| |
| <div class="right-buttons"> |
| <a href="print.html" title="Print this book" aria-label="Print this book"> |
| <i id="print-button" class="fa fa-print"></i> |
| </a> |
| <a href="https://github.com/rust-lang/rustc-dev-guide" title="Git repository" aria-label="Git repository"> |
| <i id="git-repository-button" class="fa fa-github"></i> |
| </a> |
| <a href="https://github.com/rust-lang/rustc-dev-guide/edit/master/src/contributing.md" title="Suggest an edit" aria-label="Suggest an edit"> |
| <i id="git-edit-button" class="fa fa-edit"></i> |
| </a> |
| |
| </div> |
| </div> |
| |
| <div id="search-wrapper" class="hidden"> |
| <form id="searchbar-outer" class="searchbar-outer"> |
| <input type="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header"> |
| </form> |
| <div id="searchresults-outer" class="searchresults-outer hidden"> |
| <div id="searchresults-header" class="searchresults-header"></div> |
| <ul id="searchresults"> |
| </ul> |
| </div> |
| </div> |
| |
| <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM --> |
| <script> |
| document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible'); |
| document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible'); |
| Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) { |
| link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1); |
| }); |
| </script> |
| |
| <div id="content" class="content"> |
| <main> |
| <h1 id="contribution-procedures"><a class="header" href="#contribution-procedures">Contribution procedures</a></h1> |
| <ul> |
| <li><a href="#bug-reports">Bug reports</a></li> |
| <li><a href="#bug-fixes-or-normal-code-changes">Bug fixes or "normal" code changes</a></li> |
| <li><a href="#new-features">New features</a> |
| <ul> |
| <li><a href="#breaking-changes">Breaking changes</a></li> |
| <li><a href="#major-changes">Major changes</a></li> |
| <li><a href="#performance">Performance</a></li> |
| </ul> |
| </li> |
| <li><a href="#pull-requests">Pull requests</a> |
| <ul> |
| <li><a href="#keeping-your-branch-up-to-date">Keeping your branch up-to-date</a></li> |
| <li><a href="#r">r?</a></li> |
| <li><a href="#waiting-for-reviews">Waiting for reviews</a></li> |
| <li><a href="#ci">CI</a></li> |
| <li><a href="#r-1">r+</a></li> |
| <li><a href="#opening-a-pr">Opening a PR</a></li> |
| <li><a href="#reverting-a-pr">Reverting a PR</a></li> |
| </ul> |
| </li> |
| <li><a href="#external-dependencies">External dependencies</a></li> |
| <li><a href="#writing-documentation">Writing documentation</a> |
| <ul> |
| <li><a href="#contributing-to-rustc-dev-guide">Contributing to rustc-dev-guide</a> |
| <ul> |
| <li><a href="#-note-where-to-contribute-rustc-dev-guide-changes">⚠️ Note: Where to contribute <code>rustc-dev-guide</code> changes</a></li> |
| </ul> |
| </li> |
| </ul> |
| </li> |
| <li><a href="#issue-triage">Issue triage</a> |
| <ul> |
| <li><a href="#rfcbot-labels">Rfcbot labels</a></li> |
| </ul> |
| </li> |
| <li><a href="#helpful-links-and-information">Helpful links and information</a></li> |
| </ul> |
| <h2 id="bug-reports"><a class="header" href="#bug-reports">Bug reports</a></h2> |
| <p>While bugs are unfortunate, they're a reality in software. We can't fix what we |
| don't know about, so please report liberally. If you're not sure if something |
| is a bug or not, feel free to file a bug anyway.</p> |
| <p><strong>If you believe reporting your bug publicly represents a security risk to Rust users, |
| please follow our <a href="https://www.rust-lang.org/policies/security">instructions for reporting security vulnerabilities</a></strong>.</p> |
| <p>If you're using the nightly channel, please check if the bug exists in the |
| latest toolchain before filing your bug. It might be fixed already.</p> |
| <p>If you have the chance, before reporting a bug, please <a href="https://github.com/rust-lang/rust/issues?q=is%3Aissue">search existing issues</a>, |
| as it's possible that someone else has already reported your error. This doesn't |
| always work, and sometimes it's hard to know what to search for, so consider this |
| extra credit. We won't mind if you accidentally file a duplicate report.</p> |
| <p>Similarly, to help others who encountered the bug find your issue, consider |
| filing an issue with a descriptive title, which contains information that might |
| be unique to it. This can be the language or compiler feature used, the |
| conditions that trigger the bug, or part of the error message if there is any. |
| An example could be: <strong>"impossible case reached" on lifetime inference for impl |
| Trait in return position</strong>.</p> |
| <p>Opening an issue is as easy as following <a href="https://github.com/rust-lang/rust/issues/new/choose">this |
| link</a> and filling out the fields |
| in the appropriate provided template.</p> |
| <h2 id="bug-fixes-or-normal-code-changes"><a class="header" href="#bug-fixes-or-normal-code-changes">Bug fixes or "normal" code changes</a></h2> |
| <p>For most PRs, no special procedures are needed. You can just <a href="#pull-requests">open a PR</a>, and it |
| will be reviewed, approved, and merged. This includes most bug fixes, |
| refactorings, and other user-invisible changes. The next few sections talk |
| about exceptions to this rule.</p> |
| <p>Also, note that it is perfectly acceptable to open WIP PRs or GitHub <a href="https://github.blog/2019-02-14-introducing-draft-pull-requests/">Draft PRs</a>. |
| Some people prefer to do this so they can get feedback along the |
| way or share their code with a collaborator. Others do this so they can utilize |
| the CI to build and test their PR (e.g. when developing on a slow machine).</p> |
| <h2 id="new-features"><a class="header" href="#new-features">New features</a></h2> |
| <p>Rust has strong backwards-compatibility guarantees. Thus, new features can't |
| just be implemented directly in stable Rust. Instead, we have 3 release |
| channels: stable, beta, and nightly.</p> |
| <ul> |
| <li><strong>Stable</strong>: this is the latest stable release for general usage.</li> |
| <li><strong>Beta</strong>: this is the next release (will be stable within 6 weeks).</li> |
| <li><strong>Nightly</strong>: follows the <code>master</code> branch of the repo. This is the only |
| channel where unstable, incomplete, or experimental features are usable with |
| feature gates.</li> |
| </ul> |
| <p>See <a href="./implementing_new_features.html">this chapter on implementing new features</a> for more |
| information.</p> |
| <h3 id="breaking-changes"><a class="header" href="#breaking-changes">Breaking changes</a></h3> |
| <p>Breaking changes have a <a href="bug-fix-procedure.html">dedicated section</a> in the dev-guide.</p> |
| <h3 id="major-changes"><a class="header" href="#major-changes">Major changes</a></h3> |
| <p>The compiler team has a special process for large changes, whether or not they |
| cause breakage. This process is called a Major Change Proposal (MCP). MCP is a |
| relatively lightweight mechanism for getting feedback on large changes to the |
| compiler (as opposed to a full RFC or a design meeting with the team).</p> |
| <p>Example of things that might require MCPs include major refactorings, changes |
| to important types, or important changes to how the compiler does something, or |
| smaller user-facing changes.</p> |
| <p><strong>When in doubt, ask on <a href="https://rust-lang.zulipchat.com/#narrow/stream/131828-t-compiler">zulip</a>. It would be a shame to put a lot of work |
| into a PR that ends up not getting merged!</strong> <a href="https://forge.rust-lang.org/compiler/proposals-and-stabilization.html#how-do-i-submit-an-mcp">See this document</a> for |
| more info on MCPs.</p> |
| <h3 id="performance"><a class="header" href="#performance">Performance</a></h3> |
| <p>Compiler performance is important. We have put a lot of effort over the last |
| few years into <a href="https://perf.rust-lang.org/dashboard.html">gradually improving it</a>.</p> |
| <p>If you suspect that your change may cause a performance regression (or |
| improvement), you can request a "perf run" (and your reviewer may also request one |
| before approving). This is yet another bot that will compile a collection of |
| benchmarks on a compiler with your changes. The numbers are reported |
| <a href="https://perf.rust-lang.org">here</a>, and you can see a comparison of your changes against the latest |
| master.</p> |
| <blockquote> |
| <p>For an introduction to the performance of Rust code in general |
| which would also be useful in rustc development, see <a href="https://nnethercote.github.io/perf-book/">The Rust Performance Book</a>.</p> |
| </blockquote> |
| <h2 id="pull-requests"><a class="header" href="#pull-requests">Pull requests</a></h2> |
| <p>Pull requests (or PRs for short) are the primary mechanism we use to change Rust. |
| GitHub itself has some <a href="https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests">great documentation</a> on using the |
| Pull Request feature. We use the "fork and pull" model <a href="https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/getting-started/about-collaborative-development-models#fork-and-pull-model">described here</a>, |
| where contributors push changes to their personal fork and create pull requests to |
| bring those changes into the source repository. We have more info about how to use git |
| when contributing to Rust under <a href="./git.html">the git section</a>.</p> |
| <blockquote> |
| <p><strong>Advice for potentially large, complex, cross-cutting and/or very domain-specific changes</strong></p> |
| <p>The compiler reviewers on rotation usually each have areas of the compiler that they know well, |
| but also have areas that they are not very familiar with. If your PR contains changes that are |
| large, complex, cross-cutting and/or highly domain-specific, it becomes very difficult to find a |
| suitable reviewer who is comfortable in reviewing all of the changes in such a PR. This is also |
| true if the changes are not only compiler-specific but also contains changes which fall under the |
| purview of reviewers from other teams, like the standard library team. <a href="https://github.com/rust-lang/rust/blob/master/triagebot.toml">There's a bot</a> |
| which notifies the relevant teams and pings people who have setup specific alerts based on the |
| files modified.</p> |
| <p>Before making such changes, you are strongly encouraged to <strong>discuss your proposed changes with |
| the compiler team beforehand</strong> (and with other teams that the changes would require approval |
| from), and work with the compiler team to see if we can help you <strong>break down a large potentially |
| unreviewable PR into a series of smaller more individually reviewable PRs</strong>.</p> |
| <p>You can communicate with the compiler team by creating a <a href="https://rust-lang.zulipchat.com/#narrow/stream/131828-t-compiler">#t-compiler thread on zulip</a> |
| to discuss your proposed changes.</p> |
| <p>Communicating with the compiler team beforehand helps in several ways:</p> |
| <ol> |
| <li>It increases the likelihood of your PRs being reviewed in a timely manner. |
| <ul> |
| <li>We can help you identify suitable reviewers <em>before</em> you open actual PRs, or help find |
| advisors and liaisons to help you navigate the change procedures, or help with running |
| try-jobs, perf runs and crater runs as suitable.</li> |
| </ul> |
| </li> |
| <li>It helps the compiler team track your changes.</li> |
| <li>The compiler team can perform vibe checks on your changes early and often, to see if the |
| direction of the changes align with what the compiler team prefers to see.</li> |
| <li>Helps to avoid situations where you may have invested significant time and effort into large |
| changes that the compiler team might not be willing to accept, or finding out very late that the |
| changes are in a direction that the compiler team disagrees with.</li> |
| </ol> |
| </blockquote> |
| <h3 id="keeping-your-branch-up-to-date"><a class="header" href="#keeping-your-branch-up-to-date">Keeping your branch up-to-date</a></h3> |
| <p>The CI in rust-lang/rust applies your patches directly against the current master, |
| not against the commit your branch is based on. This can lead to unexpected failures |
| if your branch is outdated, even when there are no explicit merge conflicts.</p> |
| <p>Before submitting or updating a PR, make sure to update your branch |
| as mentioned <a href="git.html#keeping-things-up-to-date">here</a> if it's significantly |
| behind the master branch (e.g., more than 100 commits behind). |
| This fetches the latest master branch and rebases your changes on top of it, |
| ensuring your PR is tested against the latest code.</p> |
| <p>After rebasing, it's recommended to <a href="tests/intro.html">run the relevant tests locally</a> to catch any issues before CI runs.</p> |
| <h3 id="r"><a class="header" href="#r">r?</a></h3> |
| <p>All pull requests are reviewed by another person. We have a bot, |
| <a href="https://github.com/rustbot">@rustbot</a>, that will automatically assign a random person |
| to review your request based on which files you changed.</p> |
| <p>If you want to request that a specific person reviews your pull request, you |
| can add an <code>r?</code> to the pull request description or in a comment. For example, |
| if you want to ask a review to @awesome-reviewer, add</p> |
| <pre><code>r? @awesome-reviewer |
| </code></pre> |
| <p>to the end of the pull request description, and <a href="https://github.com/rustbot">@rustbot</a> will assign |
| them instead of a random person. This is entirely optional.</p> |
| <p>You can also assign a random reviewer from a specific team by writing <code>r? rust-lang/groupname</code>. |
| As an example, |
| if you were making a diagnostics change, |
| then you could get a reviewer from the diagnostics team by adding:</p> |
| <pre><code>r? rust-lang/diagnostics |
| </code></pre> |
| <p>For a full list of possible <code>groupname</code>s, |
| check the <code>adhoc_groups</code> section at the <a href="https://github.com/rust-lang/rust/blob/HEAD/triagebot.toml">triagebot.toml config file</a>, |
| or the list of teams in the <a href="https://github.com/rust-lang/team/tree/HEAD/teams">rust-lang teams database</a>.</p> |
| <h3 id="waiting-for-reviews"><a class="header" href="#waiting-for-reviews">Waiting for reviews</a></h3> |
| <blockquote> |
| <p>NOTE</p> |
| <p>Pull request reviewers are often working at capacity, |
| and many of them are contributing on a volunteer basis. |
| In order to minimize review delays, |
| pull request authors and assigned reviewers should ensure that the review label |
| (<code>S-waiting-on-review</code> and <code>S-waiting-on-author</code>) stays updated, |
| invoking these commands when appropriate:</p> |
| <ul> |
| <li> |
| <p><code>@rustbot author</code>: |
| the review is finished, |
| and PR author should check the comments and take action accordingly.</p> |
| </li> |
| <li> |
| <p><code>@rustbot review</code>: |
| the author is ready for a review, |
| and this PR will be queued again in the reviewer's queue.</p> |
| </li> |
| </ul> |
| </blockquote> |
| <p>Please note that the reviewers are humans, who for the most part work on <code>rustc</code> |
| in their free time. This means that they can take some time to respond and review |
| your PR. It also means that reviewers can miss some PRs that are assigned to them.</p> |
| <p>To try to move PRs forward, the Triage WG regularly goes through all PRs that |
| are waiting for review and haven't been discussed for at least 2 weeks. If you |
| don't get a review within 2 weeks, feel free to ask the Triage WG on |
| Zulip (<a href="https://rust-lang.zulipchat.com/#narrow/stream/242269-t-release.2Ftriage">#t-release/triage</a>). They have knowledge of when to ping, who might be |
| on vacation, etc.</p> |
| <p>The reviewer may request some changes using the GitHub code review interface. |
| They may also request special procedures for some PRs. |
| See <a href="tests/crater.html">Crater</a> and <a href="bug-fix-procedure.html">Breaking Changes</a> chapters for some examples of such procedures.</p> |
| <h3 id="ci"><a class="header" href="#ci">CI</a></h3> |
| <p>In addition to being reviewed by a human, pull requests are automatically tested, |
| thanks to continuous integration (CI). Basically, every time you open and update |
| a pull request, CI builds the compiler and tests it against the |
| <a href="tests/intro.html">compiler test suite</a>, and also performs other tests such as checking that |
| your pull request is in compliance with Rust's style guidelines.</p> |
| <p>Running continuous integration tests allows PR authors to catch mistakes early |
| without going through a first review cycle, and also helps reviewers stay aware |
| of the status of a particular pull request.</p> |
| <p>Rust has plenty of CI capacity, and you should never have to worry about wasting |
| computational resources each time you push a change. It is also perfectly fine |
| (and even encouraged!) to use the CI to test your changes if it can help your |
| productivity. In particular, we don't recommend running the full <code>./x test</code> suite locally, |
| since it takes a very long time to execute.</p> |
| <h3 id="r-1"><a class="header" href="#r-1">r+</a></h3> |
| <p>After someone has reviewed your pull request, they will leave an annotation |
| on the pull request with an <code>r+</code>. It will look something like this:</p> |
| <pre><code>@bors r+ |
| </code></pre> |
| <p>This tells <a href="https://github.com/bors">@bors</a>, our lovable integration bot, that your pull request has |
| been approved. The PR then enters the <a href="https://bors.rust-lang.org/queue/rust">merge queue</a>, where <a href="https://github.com/bors">@bors</a> |
| will run <em>all</em> the tests on <em>every</em> platform we support. If it all works out, |
| <a href="https://github.com/bors">@bors</a> will merge your code into <code>master</code> and close the pull request.</p> |
| <p>Depending on the scale of the change, you may see a slightly different form of <code>r+</code>:</p> |
| <pre><code>@bors r+ rollup |
| </code></pre> |
| <p>The additional <code>rollup</code> tells <a href="https://github.com/bors">@bors</a> that this change should always be "rolled up". |
| Changes that are rolled up are tested and merged alongside other PRs, to |
| speed the process up. Typically only small changes that are expected not to conflict |
| with one another are marked as "always roll up".</p> |
| <p>Be patient; this can take a while and the queue can sometimes be long. PRs are never merged by hand.</p> |
| <h3 id="opening-a-pr"><a class="header" href="#opening-a-pr">Opening a PR</a></h3> |
| <p>You are now ready to file a pull request? Great! Here are a few points you |
| should be aware of.</p> |
| <p>All pull requests should be filed against the <code>master</code> branch, |
| unless you know for sure that you should target a different branch.</p> |
| <p>Make sure your pull request is in compliance with Rust's style guidelines by running</p> |
| <pre><code>$ ./x test tidy --bless |
| </code></pre> |
| <p>We recommend to make this check before every pull request (and every new commit |
| in a pull request); you can add <a href="https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks">git hooks</a> |
| before every push to make sure you never forget to make this check. |
| The CI will also run tidy and will fail if tidy fails.</p> |
| <p>Rust follows a <em>no merge-commit policy</em>, meaning, when you encounter merge |
| conflicts you are expected to always rebase instead of merging. E.g. always use |
| rebase when bringing the latest changes from the master branch to your feature |
| branch. If your PR contains merge commits, it will get marked as <code>has-merge-commits</code>. |
| Once you have removed the merge commits, e.g., through an interactive rebase, you |
| should remove the label again:</p> |
| <pre><code>@rustbot label -has-merge-commits |
| </code></pre> |
| <p>See <a href="./rustbot.html#issue-relabeling">this chapter</a> for more details.</p> |
| <p>If you encounter merge conflicts or when a reviewer asks you to perform some |
| changes, your PR will get marked as <code>S-waiting-on-author</code>. When you resolve |
| them, you should use <code>@rustbot</code> to mark it as <code>S-waiting-on-review</code>:</p> |
| <pre><code>@rustbot ready |
| </code></pre> |
| <p>GitHub allows <a href="https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue">closing issues using keywords</a>. This feature |
| should be used to keep the issue tracker tidy. However, it is generally preferred |
| to put the "closes #123" text in the PR description rather than the issue commit; |
| particularly during rebasing, citing the issue number in the commit can "spam" |
| the issue in question.</p> |
| <p>However, if your PR fixes a stable-to-beta or stable-to-stable regression and has |
| been accepted for a beta and/or stable backport (i.e., it is marked <code>beta-accepted</code> |
| and/or <code>stable-accepted</code>), please do <em>not</em> use any such keywords since we don't |
| want the corresponding issue to get auto-closed once the fix lands on master. |
| Please update the PR description while still mentioning the issue somewhere. |
| For example, you could write <code>Fixes (after beta backport) #NNN.</code>.</p> |
| <p>As for further actions, please keep a sharp look-out for a PR whose title begins with |
| <code>[beta]</code> or <code>[stable]</code> and which backports the PR in question. When that one gets |
| merged, the relevant issue can be closed. The closing comment should mention all |
| PRs that were involved. If you don't have the permissions to close the issue, please |
| leave a comment on the original PR asking the reviewer to close it for you.</p> |
| <h3 id="reverting-a-pr"><a class="header" href="#reverting-a-pr">Reverting a PR</a></h3> |
| <p>When a PR leads to miscompile, significant performance regressions, or other critical issues, we may |
| want to revert that PR with a regression test case. You can also check out the <a href="https://forge.rust-lang.org/compiler/reviews.html?highlight=revert#reverts">revert policy</a> on |
| Forge docs (which is mainly targeted for reviewers, but contains useful info for PR authors too).</p> |
| <p>If the PR contains huge changes, it can be challenging to revert, making it harder to review |
| incremental fixes in subsequent updates. Or if certain code in that PR is heavily depended upon by |
| subsequent PRs, reverting it can become difficult.</p> |
| <p>In such cases, we can identify the problematic code and disable it for some input, as shown in <a href="https://github.com/rust-lang/rust/pull/128271">#128271</a>.</p> |
| <p>For MIR optimizations, we can also use the <code>-Zunsound-mir-opt</code> option to gate the mir-opt, as shown |
| in <a href="https://github.com/rust-lang/rust/pull/132356">#132356</a>.</p> |
| <h2 id="external-dependencies"><a class="header" href="#external-dependencies">External dependencies</a></h2> |
| <p>This section has moved to <a href="./external-repos.html">"Using External Repositories"</a>.</p> |
| <h2 id="writing-documentation"><a class="header" href="#writing-documentation">Writing documentation</a></h2> |
| <p>Documentation improvements are very welcome. The source of <code>doc.rust-lang.org</code> |
| is located in <a href="https://github.com/rust-lang/rust/tree/master/src/doc"><code>src/doc</code></a> in the tree, and standard API documentation is generated |
| from the source code itself (e.g. <a href="https://github.com/rust-lang/rust/blob/master/library/std/src/lib.rs#L1"><code>library/std/src/lib.rs</code></a>). Documentation pull requests |
| function in the same way as other pull requests.</p> |
| <p>To find documentation-related issues, use the <a href="https://github.com/rust-lang/rust/issues?q=is%3Aopen%20is%3Aissue%20label%3AA-docs">A-docs label</a>.</p> |
| <p>You can find documentation style guidelines in <a href="https://github.com/rust-lang/rfcs/blob/master/text/1574-more-api-documentation-conventions.md#appendix-a-full-conventions-text">RFC 1574</a>.</p> |
| <p>To build the standard library documentation, use <code>x doc --stage 1 library --open</code>. |
| To build the documentation for a book (e.g. the unstable book), use <code>x doc src/doc/unstable-book.</code> |
| Results should appear in <code>build/host/doc</code>, as well as automatically open in your default browser. |
| See <a href="./building/compiler-documenting.html#building-documentation">Building Documentation</a> for more |
| information.</p> |
| <p>You can also use <code>rustdoc</code> directly to check small fixes. For example, |
| <code>rustdoc src/doc/reference.md</code> will render reference to <code>doc/reference.html</code>. |
| The CSS might be messed up, but you can verify that the HTML is right.</p> |
| <h3 id="contributing-to-rustc-dev-guide"><a class="header" href="#contributing-to-rustc-dev-guide">Contributing to rustc-dev-guide</a></h3> |
| <p>Contributions to the <a href="https://rustc-dev-guide.rust-lang.org/">rustc-dev-guide</a> are always welcome, and can be made directly at |
| <a href="https://github.com/rust-lang/rustc-dev-guide">the rust-lang/rustc-dev-guide repo</a>. |
| The issue tracker in that repo is also a great way to find things that need doing. |
| There are issues for beginners and advanced compiler devs alike!</p> |
| <p>Just a few things to keep in mind:</p> |
| <ul> |
| <li> |
| <p>Please try to avoid overly long lines and use semantic line breaks (where you break the line after each sentence). |
| There is no strict limit on line lengths; let the sentence or part of the sentence flow to its proper end on the same line.</p> |
| </li> |
| <li> |
| <p>When contributing text to the guide, please contextualize the information with some time period |
| and/or a reason so that the reader knows how much to trust the information. |
| Aim to provide a reasonable amount of context, possibly including but not limited to:</p> |
| <ul> |
| <li> |
| <p>A reason for why the data may be out of date other than "change", |
| as change is a constant across the project.</p> |
| </li> |
| <li> |
| <p>The date the comment was added, e.g. instead of writing <em>"Currently, ..."</em> |
| or <em>"As of now, ..."</em>, |
| consider adding the date, in one of the following formats:</p> |
| <ul> |
| <li>Jan 2021</li> |
| <li>January 2021</li> |
| <li>jan 2021</li> |
| <li>january 2021</li> |
| </ul> |
| <p>There is a CI action (in <code>.github/workflows/date-check.yml</code>) |
| that generates a monthly report showing those that are over 6 months old |
| (<a href="https://github.com/rust-lang/rustc-dev-guide/issues/2052">example</a>).</p> |
| <p>For the action to pick the date, |
| add a special annotation before specifying the date:</p> |
| <pre><code class="language-md"><!-- date-check --> Apr 2025 |
| </code></pre> |
| <p>Example:</p> |
| <pre><code class="language-md">As of <!-- date-check --> Apr 2025, the foo did the bar. |
| </code></pre> |
| <p>For cases where the date should not be part of the visible rendered output, |
| use the following instead:</p> |
| <pre><code class="language-md"><!-- date-check: Apr 2025 --> |
| </code></pre> |
| </li> |
| <li> |
| <p>A link to a relevant WG, tracking issue, <code>rustc</code> rustdoc page, or similar, that may provide |
| further explanation for the change process or a way to verify that the information is not |
| outdated.</p> |
| </li> |
| </ul> |
| </li> |
| <li> |
| <p>If a text grows rather long (more than a few page scrolls) or complicated (more than four |
| subsections), |
| it might benefit from having a Table of Contents at the beginning, |
| which you can auto-generate by including the <code><!-- toc --></code> marker at the top.</p> |
| </li> |
| </ul> |
| <h4 id="-note-where-to-contribute-rustc-dev-guide-changes"><a class="header" href="#-note-where-to-contribute-rustc-dev-guide-changes">⚠️ Note: Where to contribute <code>rustc-dev-guide</code> changes</a></h4> |
| <p>For detailed information about where to contribute rustc-dev-guide changes and the benefits of doing so, see <a href="https://forge.rust-lang.org/wg-rustc-dev-guide/index.html#where-to-contribute-rustc-dev-guide-changes">the rustc-dev-guide working group documentation</a>.</p> |
| <h2 id="issue-triage"><a class="header" href="#issue-triage">Issue triage</a></h2> |
| <p>Please see <a href="https://forge.rust-lang.org/release/issue-triaging.html">https://forge.rust-lang.org/release/issue-triaging.html</a>.</p> |
| <h3 id="rfcbot-labels"><a class="header" href="#rfcbot-labels">Rfcbot labels</a></h3> |
| <p><a href="https://github.com/anp/rfcbot-rs/">rfcbot</a> uses its own labels for tracking the process of coordinating |
| asynchronous decisions, such as approving or rejecting a change. |
| This is used for <a href="https://github.com/rust-lang/rfcs">RFCs</a>, issues, and pull requests.</p> |
| <div class="table-wrapper"><table><thead><tr><th>Labels</th><th>Color</th><th>Description</th></tr></thead><tbody> |
| <tr><td><a href="https://github.com/rust-lang/rust/labels/proposed-final-comment-period">proposed-final-comment-period</a></td><td><span class="label-color" style="background-color:#ededed;"> </span> Gray</td><td>Currently awaiting signoff of all team members in order to enter the final comment period.</td></tr> |
| <tr><td><a href="https://github.com/rust-lang/rust/labels/disposition-merge">disposition-merge</a></td><td><span class="label-color" style="background-color:#008800;"> </span> Green</td><td>Indicates the intent is to merge the change.</td></tr> |
| <tr><td><a href="https://github.com/rust-lang/rust/labels/disposition-close">disposition-close</a></td><td><span class="label-color" style="background-color:#dd0000;"> </span> Red</td><td>Indicates the intent is to not accept the change and close it.</td></tr> |
| <tr><td><a href="https://github.com/rust-lang/rust/labels/disposition-postpone">disposition-postpone</a></td><td><span class="label-color" style="background-color:#ededed;"> </span> Gray</td><td>Indicates the intent is to not accept the change at this time and postpone it to a later date.</td></tr> |
| <tr><td><a href="https://github.com/rust-lang/rust/labels/final-comment-period">final-comment-period</a></td><td><span class="label-color" style="background-color:#1e76d9;"> </span> Blue</td><td>Currently soliciting final comments before merging or closing.</td></tr> |
| <tr><td><a href="https://github.com/rust-lang/rust/labels/finished-final-comment-period">finished-final-comment-period</a></td><td><span class="label-color" style="background-color:#f9e189;"> </span> Light Yellow</td><td>The final comment period has concluded, and the issue will be merged or closed.</td></tr> |
| <tr><td><a href="https://github.com/rust-lang/rfcs/labels/postponed">postponed</a></td><td><span class="label-color" style="background-color:#fbca04;"> </span> Yellow</td><td>The issue has been postponed.</td></tr> |
| <tr><td><a href="https://github.com/rust-lang/rfcs/labels/closed">closed</a></td><td><span class="label-color" style="background-color:#dd0000;"> </span> Red</td><td>The issue has been rejected.</td></tr> |
| <tr><td><a href="https://github.com/rust-lang/rfcs/labels/to-announce">to-announce</a></td><td><span class="label-color" style="background-color:#ededed;"> </span> Gray</td><td>Issues that have finished their final-comment-period and should be publicly announced. Note: the rust-lang/rust repository uses this label differently, to announce issues at the triage meetings.</td></tr> |
| </tbody></table> |
| </div> |
| <h2 id="helpful-links-and-information"><a class="header" href="#helpful-links-and-information">Helpful links and information</a></h2> |
| <p>This section has moved to the <a href="about-this-guide.html#other-places-to-find-information">"About this guide"</a> chapter.</p> |
| |
| </main> |
| |
| <nav class="nav-wrapper" aria-label="Page navigation"> |
| <!-- Mobile navigation buttons --> |
| <a rel="prev" href="crates-io.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left"> |
| <i class="fa fa-angle-left"></i> |
| </a> |
| |
| <a rel="next prefetch" href="compiler-team.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right"> |
| <i class="fa fa-angle-right"></i> |
| </a> |
| |
| <div style="clear: both"></div> |
| </nav> |
| </div> |
| </div> |
| |
| <nav class="nav-wide-wrapper" aria-label="Page navigation"> |
| <a rel="prev" href="crates-io.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left"> |
| <i class="fa fa-angle-left"></i> |
| </a> |
| |
| <a rel="next prefetch" href="compiler-team.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right"> |
| <i class="fa fa-angle-right"></i> |
| </a> |
| </nav> |
| |
| </div> |
| |
| |
| |
| |
| <script> |
| window.playground_copyable = true; |
| </script> |
| |
| |
| <script src="elasticlunr.min.js"></script> |
| <script src="mark.min.js"></script> |
| <script src="searcher.js"></script> |
| |
| <script src="clipboard.min.js"></script> |
| <script src="highlight.js"></script> |
| <script src="book.js"></script> |
| |
| <!-- Custom JS scripts --> |
| <script src="mermaid.min.js"></script> |
| <script src="mermaid-init.js"></script> |
| |
| |
| </div> |
| </body> |
| </html> |