Skip to content

[BUG]  #792

Closed
Closed
[BUG] #792
@iprtel

Description

@iprtel

Describe the bug
cppfront produces CPP1 code that is no accepted by gcc-11.4 or clang-18.0.0

To Reproduce

  1. in issue_base.h
class IssueBase {
public:
    virtual bool virtualConstFunction() const = 0;
    virtual bool virtualFunction() = 0;
};
  1. in issue.cpp2
#include "issue_base.h"
Issue : type = {
    virtualConstFunction : (this) -> bool = {
        std::cout << "virtual const function called\n";
        return true;
    }
    virtualFunction : (inout this) -> bool = {
        std::cout << "virtual function called\n";
        return false;
    }
}

main : () = {
    issue : Issue = ();
    issue.virtualFunction();
    issue.virtualConstFunction();
    issue.virtualFunction();
}

Cppfront generates std::move(issue) for the last use of issue in main. This works fine if virtualConstFunction is the last function called but fails if virtualFunction is the last call.

gcc-11.4.0:

[proc] Executing command: /usr/bin/cmake --build /workspaces/cpp2_learn/build --config Debug --target issue -j 10 --
[build] [1/3 33% :: 0.007] Generating ../_cppfront/issue.cpp
[build] /workspaces/cpp2_learn/issue/issue.cpp2... ok (mixed Cpp1/Cpp2, Cpp2 code passes safety checks)
[build]
[build] [2/3 66% :: 1.423] Building CXX object issue/CMakeFiles/issue.dir//_cppfront/issue.cpp.o
[build] FAILED: issue/CMakeFiles/issue.dir/
/_cppfront/issue.cpp.o
[build] /usr/bin/g++ -I/workspaces/cpp2_learn/issue -isystem /workspaces/cpp2_learn/cppfront/cppfront/include -g -std=gnu++20 -MD -MT issue/CMakeFiles/issue.dir//_cppfront/issue.cpp.o -MF issue/CMakeFiles/issue.dir//_cppfront/issue.cpp.o.d -o issue/CMakeFiles/issue.dir/__/_cppfront/issue.cpp.o -c /workspaces/cpp2_learn/build/_cppfront/issue.cpp
[build] In file included from /workspaces/cpp2_learn/build/_cppfront/issue.cpp:7:
[build] /workspaces/cpp2_learn/issue/issue.cpp2: In instantiation of 'main()::<lambda(auto:80&&)> [with auto:80 = Issue]':
[build] /workspaces/cpp2_learn/issue/issue.cpp2:19:5: required from here
[build] /workspaces/cpp2_learn/issue/issue.cpp2:19:5: error: 'virtualFunction' was not declared in this scope
[build] 19 | issue.virtualFunction();
[build] | ^
[build] ninja: build stopped: subcommand failed.

clang-18.0.0:

[build] [1/3 33% :: 0.006] Generating ../_cppfront/issue.cpp
[build] /workspaces/cpp2_learn/issue/issue.cpp2... ok (mixed Cpp1/Cpp2, Cpp2 code passes safety checks)
[build]
[build] [2/3 66% :: 1.704] Building CXX object issue/CMakeFiles/issue.dir//_cppfront/issue.cpp.o
[build] FAILED: issue/CMakeFiles/issue.dir/
/_cppfront/issue.cpp.o
[build] /usr/bin/clang++-18 -I/workspaces/cpp2_learn/issue -isystem /workspaces/cpp2_learn/cppfront/cppfront/include -g -std=gnu++20 -MD -MT issue/CMakeFiles/issue.dir//_cppfront/issue.cpp.o -MF issue/CMakeFiles/issue.dir//_cppfront/issue.cpp.o.d -o issue/CMakeFiles/issue.dir/__/_cppfront/issue.cpp.o -c /workspaces/cpp2_learn/build/_cppfront/issue.cpp
[build] /workspaces/cpp2_learn/issue/issue.cpp2:19:17: error: use of undeclared identifier 'virtualFunction'
[build] 19 | CPP2_UFCS_0(virtualFunction, std::move(issue));
[build] | ^
[build] /workspaces/cpp2_learn/issue/issue.cpp2:19:5: note: in instantiation of function template specialization 'main()::(anonymous class)::operator()' requested here
[build] 19 | CPP2_UFCS_0(virtualFunction, std::move(issue));
[build] | ^
[build] /workspaces/cpp2_learn/cppfront/cppfront/include/cpp2util.h:797:2: note: expanded from macro 'CPP2_UFCS_0'
[build] 797 | }(PARAM1)
[build] | ^
[build] 1 error generated.
[build] ninja: build stopped: subcommand failed.

The generated main:

#line 14 "/workspaces/cpp2_learn/issue/issue.cpp2"
auto main() -> int{
    Issue issue {}; 

    CPP2_UFCS_0(virtualFunction, issue);
    CPP2_UFCS_0(virtualConstFunction, issue);
    CPP2_UFCS_0(virtualFunction, std::move(issue));
}

If the std::move(...) is removed around issue both compilers accept the code.

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