inline specifiers should be removed from from the function declaration and
the newly-created implementation.
For example, take the following (working) code:
cpp
// foo.hpp
struct A {
inline void foo() { std::cout << "hello world\n" << std::flush; }
};
// foo.cpp
#include "foo.hpp"
// main.cpp
#include "foo.hpp"
int main() {
A a;
a.foo();
return 0;
}
// compile: clang++ -std=c++20 main.cpp foo.cpp -o mainAfter applying the tweak:
// foo.hpp
struct A {
inline void foo();
};
// foo.cpp
#include "foo.hpp"
inline void A::foo() { std::cout << "hello world\n" << std::flush; }
// main.cpp
#include "foo.hpp"
int main() {
A a;
a.foo();
return 0;
}
// compile: clang++ -std=c++20 main.cpp foo.cpp -o mainWe get a link error, as expected:
/usr/bin/ld: /tmp/main-4c5d99.o: in function `main': main.cpp:(.text+0x14): undefined reference to `A::foo()' clang: error: linker command failed with exit code 1 (use -v to see invocation)
This revision removes these specifiers from both the header and the source file. This was identified in Github issue llvm/llvm-project#61295.
This was extracted from the DelKeyword lambda in getFunctionSourceCode since it now is used within apply as well.
Note that since this returns a tooling::Replacements, the caller must combine the result with other Replacements via tooling::Replacements::merge. This is my first time contributing to this project, so please let me know if using merge (instead of add) could cause performance issues. I can change this so that we add to a tooling::Replacements out-parameter, instead.