https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88388
Bug ID: 88388
Summary: GCC falsely determines string literal to be unused
Product: gcc
Version: 7.3.0
Status: UNCONFIRMED
Keywords: wrong-code
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: Kimon.Hoffmann at lawo dot com
Target Milestone: ---
I have recently run into an issue with the (minimized) example below.
Test.cpp:
#include <string_view>
constexpr std::string_view test_func() noexcept
{
constexpr auto const CHARACTER_SOUP = std::string_view{"somechars"};
return CHARACTER_SOUP;
}
void f(std::string_view);
void call_f()
{
f(test_func());
}
Compiled with:
g++ -std=c++17 -Wall -Wextra -c -S Test.cpp
Expected result:
The generated assembly should contain the string literal "somechars" and
pass it from call_f() to f() in the form of a std::string_view instance.
Actual result:
The generated assembly does not contain the string literal and a default
constructed std::string_view instance is passed from call_f() to f() instead.
Notes:
* Newer versions of GCC produce the expected result.
* Please note that this error happens on any optimization level including
-O0. But using -O3 makes thee generated assembly more easy to follow.
* While this issue has some similarity to the issue I (erroneously)
reported as bug #85873, the major difference here is that string literals have
static storage duration.
Link:
Here is a the example on godbolt.org: https://godbolt.org/z/iKxQga
Please note that this example uses -O3 to make the generate assembly as
concise as possible.