- 
                Notifications
    You must be signed in to change notification settings 
- Fork 264
Description
Describe the bug
cppfront produces CPP1 code that is no accepted by gcc-11.4 or clang-18.0.0
To Reproduce
- in issue_base.h
class IssueBase {
public:
    virtual bool virtualConstFunction() const = 0;
    virtual bool virtualFunction() = 0;
};
- 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.