https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86590
Bug ID: 86590 Summary: Codegen regression when passing std::string by value in C++ 17 and C++ 20 Product: gcc Version: tree-ssa Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: s_gccbugzilla at nedprod dot com Target Milestone: --- If compiled as C++ 14: #include <string> inline size_t calc(std::string a, std::string b) { return a.size() + b.size(); } int foo() { std::string a = "Hello world", b = "Goodbye world"; return calc(a, b); } ...one gets: foo(): mov eax, 24 ret But if compiled as C++ 17 or later, one gets lots of spew: https://godbolt.org/g/jCzpAS Using std::move() generates the right result in C++ 17 or later: https://godbolt.org/g/tHXpyy. I think it should also work by value, like it did in C++ 11 and C++ 14.