Skip to content

Tracking issue for RFC 2302, Tuple struct construction with Self(v1, v2, ..) #51994

Closed

Description

@Centril

This is a tracking issue for the RFC "Tuple struct construction with Self(v1, v2, ..)" (rust-lang/rfcs#2302).

Steps:

Unresolved questions:

None

Activity

  1. added
    B-RFC-approvedBlocker: Approved by a merged RFC but not yet implemented.
    T-langRelevant to the language team
    C-tracking-issueCategory: An issue tracking the progress of sth. like the implementation of an RFC
    on Jul 2, 2018
  2. added 2 commits that reference this issue on Sep 13, 2018
  3. shepmaster commented on Sep 15, 2018

    @shepmaster
    Member

    Code that implements this has been merged.

    #![feature(self_struct_ctor)]
    
    struct Example(i32, bool);
    
    impl Example {
        fn new() -> Self {
            Self(42, true)
        }
    }

    playground

  4. added
    B-unstableBlocker: Implemented in the nightly compiler and unstable.
    B-RFC-implementedBlocker: Approved by a merged RFC and implemented but not stabilized.
    on Sep 15, 2018
  5. Centril commented on Nov 11, 2018

    @Centril
    ContributorAuthor

    @rfcbot merge

    Stabilization report & proposal

    Feature name: #![feature(self_struct_ctor)]
    Version target: 1.32 (2019-01-18)

    Originally accepted in rust-lang/rfcs#2302, I propose that we stabilize self_struct_ctor.
    This has been in nightly since 2018-09-15 which is ~8 weeks ago.

    The proposed change is not a blocker for anyone but it is a nice quality of life feature in some cases and more importantly, it makes the language less surprising and easier to learn. Furthermore, we do already permit Self { foo: ... }.

    What is being stabilized

    Relevant artefacts:

    The changes are:

    1. Self becomes a legal pattern and expression for unit structs in impls (both inherent and trait impls...).
    match Self {
        Self => ...
    }
    1. Self(x1, x2, ...) becomes a legal pattern and expression for tuple structs in impls (both inherent and trait impls...).
    match Self(0, 1) {
        Self(x, y) => ...
    }
    1. Self becomes a legal function pointer in impls (...).
    opt.map(Self)
    1. Points 1-3 work through type aliases just like Self { field: <thing> } does.

    What is not being stabilized

    Mentions of enum variants through Self is not being stabilized. For example:

    enum Foo { Variant(u8), }
    
    impl Foo {
        fn bar() {
            let x = Self::Variant(1);
        }
    }

    Divergences from RFC

    None

  6. rfcbot commented on Nov 11, 2018

    @rfcbot

    Team member @Centril has proposed to merge this. The next step is review by the rest of the tagged teams:

    No concerns currently listed.

    Once a majority of reviewers approve (and none object), this will enter its final comment period. If you spot a major issue that hasn't been raised at any point in this process, please speak up!

    See this document for info about what commands tagged team members can give me.

  7. added
    proposed-final-comment-periodProposed to merge/close by relevant subteam, see T-<team> label. Will enter FCP once signed off.
    disposition-mergeThis issue / PR is in PFCP or FCP with a disposition to merge it.
    on Nov 11, 2018
  8. rfcbot commented on Nov 23, 2018

    @rfcbot

    🔔 This is now entering its final comment period, as per the review above. 🔔

  9. added
    final-comment-periodIn the final comment period and will be merged soon unless new substantive objections are raised.
    and removed
    proposed-final-comment-periodProposed to merge/close by relevant subteam, see T-<team> label. Will enter FCP once signed off.
    on Nov 23, 2018
  10. caiopsouza commented on Nov 24, 2018

    @caiopsouza

    A variant of what is not being stabilized gave me an internal compiler error.

    Code:

    #![feature(self_struct_ctor)]
    #![allow(dead_code)]
    
    enum Foo {}
    
    impl Foo {
        fn bar() {
            Self(1u8);
        }
    }
    
    fn main() {}

    Compiler output:

    C:/Users/Caio/.cargo/bin/cargo.exe run --package nespera --bin nespera
       Compiling nespera v0.1.0 (C:\Users\Caio\projects\nespera)
    error: internal compiler error: cat_expr Errd
     --> src\main.rs:7:14
      |
    7 |       fn bar() {
      |  ______________^
    8 | |         Self(1u8);
    9 | |     }
      | |_____^
    
    error: internal compiler error: cat_expr Errd
     --> src\main.rs:8:9
      |
    8 |         Self(1u8);
      |         ^^^^^^^^^
    
    error: internal compiler error: cat_expr Errd
     --> src\main.rs:8:9
      |
    8 |         Self(1u8);
      |         ^^^^
    
    error: internal compiler error: QualifyAndPromoteConstants: Mir had errors
     --> src\main.rs:7:5
      |
    7 | /     fn bar() {
    8 | |         Self(1u8);
    9 | |     }
      | |_____^
    
    error: internal compiler error: broken MIR in DefId(0/0:5 ~ nespera[1ed1]::{{impl}}[0]::bar[0]) ("return type"): bad type [type error]
     --> src\main.rs:7:5
      |
    7 | /     fn bar() {
    8 | |         Self(1u8);
    9 | |     }
      | |_____^
    
    error: internal compiler error: broken MIR in DefId(0/0:5 ~ nespera[1ed1]::{{impl}}[0]::bar[0]) (LocalDecl { mutability: Mut, is_user_variable: None, internal: false, is_block_tail: None, ty: [type error], user_ty: UserTypeProjections { contents: [] }, name: None, source_info: SourceInfo { span: src\main.rs:7:5: 9:6, scope: scope[0] }, visibility_scope: scope[0] }): bad type [type error]
     --> src\main.rs:7:5
      |
    7 | /     fn bar() {
    8 | |         Self(1u8);
    9 | |     }
      | |_____^
    
    thread 'main' panicked at 'no errors encountered even though `delay_span_bug` issued', src\librustc_errors\lib.rs:334:17
    stack backtrace:
       0: std::sys_common::alloc::realloc_fallback
       1: std::panicking::take_hook
       2: std::panicking::take_hook
       3: rustc::ty::structural_impls::<impl rustc::ty::context::Lift<'tcx> for rustc::ty::instance::InstanceDef<'a>>::lift_to_tcx
       4: std::panicking::rust_panic_with_hook
       5: <rustc_errors::diagnostic::SubDiagnostic as core::fmt::Debug>::fmt
       6: <rustc_errors::Handler as core::ops::drop::Drop>::drop
       7: <humantime::duration::Error as std::error::Error>::cause
       8: <humantime::duration::Error as std::error::Error>::cause
       9: <humantime::duration::Error as std::error::Error>::cause
      10: <rustc_driver::derive_registrar::Finder as rustc::hir::itemlikevisit::ItemLikeVisitor<'v>>::visit_item
      11: _rust_maybe_catch_panic
      12: rustc_driver::profile::dump
      13: rustc_driver::main
      14: <unknown>
      15: std::panicking::update_panic_count
      16: _rust_maybe_catch_panic
      17: std::rt::lang_start_internal
      18: <unknown>
      19: <unknown>
      20: BaseThreadInitThunk
      21: RtlUserThreadStart
    query stack during panic:
    end of query stack
    
    error: internal compiler error: unexpected panic
    
    note: the compiler unexpectedly panicked. this is a bug.
    
    note: we would appreciate a bug report: https://github.com/rust-lang/rust/blob/master/CONTRIBUTING.md#bug-reports
    
    note: rustc 1.32.0-nightly (1f57e4841 2018-11-23) running on x86_64-pc-windows-msvc
    
    note: compiler flags: -C debuginfo=2 -C incremental --crate-type bin
    
    note: some of the compiler flags provided by cargo are hidden
    
    error: Could not compile `nespera`.
    
    To learn more, run the command again with --verbose.
    
    Process finished with exit code 101
    
    
  11. Centril commented on Nov 24, 2018

    @Centril
    ContributorAuthor

    @caiopsouza Thanks for reporting this! Could you file this as a separate issue so that we can track and fix it?

  12. alexreg commented on Nov 30, 2018

    @alexreg
    Contributor
  13. rfcbot commented on Dec 3, 2018

    @rfcbot

    The final comment period, with a disposition to merge, as per the review above, is now complete.

  14. added and removed
    final-comment-periodIn the final comment period and will be merged soon unless new substantive objections are raised.
    on Dec 3, 2018
  15. stefson commented on Apr 22, 2019

    @stefson

    may I ask, in which release of rust was this merged? I hit it with rustc-1.31.1?

    fixed in rustc-1.32.0, sry for the noise :-)

  16. added a commit that references this issue on Sep 16, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    B-RFC-approvedBlocker: Approved by a merged RFC but not yet implemented.B-RFC-implementedBlocker: Approved by a merged RFC and implemented but not stabilized.B-unstableBlocker: Implemented in the nightly compiler and unstable.C-tracking-issueCategory: An issue tracking the progress of sth. like the implementation of an RFCT-langRelevant to the language teamdisposition-mergeThis issue / PR is in PFCP or FCP with a disposition to merge it.finished-final-comment-periodThe final comment period is finished for this PR / Issue.

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions