Skip to content

[BUG] forward of capture $ crashes compiler #446

Open

Description

@realgdman

Describe the bug
Enclosing capture in forward crashes compiler

Reproduction Code

main: ()   [[post: (forward c$) == 5]] //error
= {
	c := 5;
	:() = { (forward c$); }; //error	
	:() = { foo(forward c$); } (); //error - possibly valid usecase	
}

foo: (forward x) = std::cout << x;

https://cpp2.godbolt.org/z/E4rqKW4cn

Version
latest (38aec57)

Command lines
cppfront/cppfront $1.cpp2 -p
clang++-15 -Icppfront/include $1.cpp -std=c++20 -o $1

Expected result
Diagnostic, probably disallowing forward with capture

Actual result
cppfront: source/cppfront.cpp:2712: void cpp2::cppfront::emit(cpp2::postfix_expression_node &, bool): Assertion `!current_args.back().ptoken' failed.
Aborted (core dumped)

Additional context
Assert line is https://github.com/hsutter/cppfront/blob/main/source/cppfront.cpp#L2712

This example shows forward can be written at call site.

copy_from(forward t.first); // moves
and it was mentioned somewhere else.
Don't know if forward with capture makes sense.

Activity

  1. realgdman commented on May 10, 2023

    @realgdman
    Author

    Probably related:
    x := (forward T<int>());
    assert on previous line.
    cppfront: source/cppfront.cpp:2711: void cpp2::cppfront::emit(cpp2::postfix_expression_node &, bool): Assertion `n.expr->get_token()' failed.

  2. JohelEGP commented on Jun 2, 2023

    @JohelEGP
    Contributor

    Resolving #408 might happen to fix this.

  3. JohelEGP commented on Aug 6, 2023

    @JohelEGP
    Contributor

    This fails with the same error (https://cpp2.godbolt.org/z/49jcdPja6):

    to: (forward v) = (forward v.to<i32>());
    main: () = { }
    
    cppfront: source/cppfront.cpp:2734: void cpp2::cppfront::emit(cpp2::postfix_expression_node&, bool): Assertion `!current_args.back().ptoken' failed.
    Program terminated with signal: SIGSEGV
    Compiler returned: 139
    
  4. JohelEGP commented on Nov 29, 2023

    @JohelEGP
    Contributor

    I tried to work around this by adding parentheses.
    It simply lowers forward without std::.
    I suppose it's due to commit c39a94c (#77).
    (forward (r$)); lowers to return forward(_0); (https://cpp2.godbolt.org/z/YTP8vd61K).

    Expected result
    Diagnostic, probably disallowing forward with capture

    This could work with std::forward_like<decltype(this)> semantics (given 4bd0c04#commitcomment-133309652): :(forward this) (forward c$).

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

    bugSomething isn't working

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions