Skip to content

Can not use argument impl Trait in type alias #139055

Closed
@LHolten

Description

@LHolten
Contributor

I tried this code:

type X = [(); {
    
    fn hello(x: impl Clone) {
        
    }
    
    3
}];

I expect this to compile, but instead i get this error.

error[E0658]: `impl Trait` in type aliases is unstable
 --> src/lib.rs:3:17
  |
3 |     fn hello(x: impl Clone) {
  |                 ^^^^^^^^^^
  |

Meta

Bug also reproduces on nightly.

rustc --version --verbose:

rustc 1.85.1 (4eb161250 2025-03-15)
binary: rustc
commit-hash: 4eb161250e340c8f48f66e2b929ef4a5bed7c181
commit-date: 2025-03-15
host: x86_64-unknown-linux-gnu
release: 1.85.1
LLVM version: 19.1.7

Activity

added
needs-triageThis issue may need triage. Remove it if it has been sufficiently triaged.
on Mar 28, 2025
added
T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.
and removed
needs-triageThis issue may need triage. Remove it if it has been sufficiently triaged.
on Mar 28, 2025
fmease

fmease commented on Mar 28, 2025

@fmease
Member

Yeep, that's the fragile visitors in ast_passes. In this case, we won't reset the context on AnonConst.

fmease

fmease commented on Mar 28, 2025

@fmease
Member

I've already reported the general issue here #119924 in the past incl. your specific issue #119924 (comment)

self-assigned this
on Mar 28, 2025
fmease

fmease commented on Mar 28, 2025

@fmease
Member

I guess you found this by fuzzing? If not, I can say I never thought sb. would stumble upon this for real ^^

LHolten

LHolten commented on Mar 28, 2025

@LHolten
ContributorAuthor

I actually stumbled into this while developing a macro that defines a new type wherever you are supposed to provide a type.
As you can see this is extremely useful and extremely cursed code :D

trait Sneak {
    type Out;
}

macro_rules! new_type {
    ($($fields:tt)*) => {
        <[(); {
            struct Bar {$($fields)*}
            impl Sneak for [(); line!() as usize] {
                type Out = Bar;
            }
            line!() as usize
        }] as Sneak>::Out
    };
}

type Test = new_type!(x: u32);
type Test2 = new_type!(x: String);

fn test(val: Test) -> Test2 {
    let Test { x } = val;
    Test2 { x: "hi".to_owned() }
}

P.S. I would appreciate anyone who uses this trick to credit me for the idea :P
(oh and you can expect to see this used to great effect in rust_query sometime soonish)

fmease

fmease commented on Mar 28, 2025

@fmease
Member

Nice! I'll send a fix shortly!

added a commit that references this issue on Mar 28, 2025

Rollup merge of rust-lang#139063 - fmease:fix-tait-atpit-gating, r=ol…

52aed95
added a commit that references this issue on Mar 29, 2025
5203144
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

C-bugCategory: This is a bug.T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

    Development

    Participants

    @fmease@LHolten@rustbot

    Issue actions

      Can not use argument impl Trait in type alias · Issue #139055 · rust-lang/rust