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.