This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c++/82000] New: Missed optimization of char_traits::length() on constant string
- From: "ldionne.2 at gmail dot com" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Sun, 27 Aug 2017 20:03:12 +0000
- Subject: [Bug c++/82000] New: Missed optimization of char_traits::length() on constant string
- Auto-submitted: auto-generated
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82000
Bug ID: 82000
Summary: Missed optimization of char_traits::length() on
constant string
Product: gcc
Version: 8.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: ldionne.2 at gmail dot com
Target Milestone: ---
In the following code, the calculation of the string length is not folded,
despite the input string being visible to the compiler:
template <char ...c>
struct string_constant {
static constexpr char internal_buffer[sizeof...(c)+1] = {c..., '\0'};
constexpr char const* c_str() const { return internal_buffer; }
constexpr std::size_t size() const { return sizeof...(c); }
};
auto const text = string_constant<'s', 'o', 'm', 'e', 'c', 'o', 'm', 'p',
'i', 'l', 'e', 't', 'i', 'm', 'e', 't', 'e', 'x', 't'>{};
int main() {
std::string_view sv1{text.c_str()}; // calculation of length not folded
std::string_view sv2{text.c_str(), text.size()}; // no work required
}
I tracked it down to `char_traits<char>::length()` not being folded. Note that
Clang folds that without problem. Here's a link on Godbolt so you can reproduce
the issue easily and look at the assembly: https://godbolt.org/g/sF3enh