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 main
After 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 main
We 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.