[PATCH] D27721: Add a c_str() member to StringLiteral

Zachary Turner via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Dec 13 10:30:43 PST 2016

zturner created this revision.
zturner added reviewers: dblaikie, mehdi_amini, malcolm.parsons, chandlerc.
zturner added a subscriber: llvm-commits.

string literals are necessarily null-terminated, so it makes sense to provide a `c_str()` method to treat it as a null terminated string.

In practice this arises because you might imagine a global table that contains option names which you want to pass to something like `getopt_long_only`, but in other situations you might want to do some comparisons on the option name (for example, is `--foo` in the options table), where you want to make use of `StringRef` comparison operators.  Of course, there are tons of other system calls or library calls which we don't have control over that take `const char*` and where we pull arguments for these functiosn from a global table of `const char *`, so this doesn't seem like just a one-off case.

Writing `.str().c_str()` for these cases is problematic since it means we cannot assume the storage will live longer than the current statement, plus it's just inefficient since we're unnecessarily incurring a copy.



Index: include/llvm/ADT/StringRef.h
--- include/llvm/ADT/StringRef.h
+++ include/llvm/ADT/StringRef.h
@@ -854,6 +854,8 @@
     template <size_t N>
     constexpr StringLiteral(const char (&Str)[N]) : StringRef(Str, N - 1) {}
+    const char *c_str() const { return data(); }
   /// @name StringRef Comparison Operators

-------------- next part --------------
A non-text attachment was scrubbed...
Name: D27721.81254.patch
Type: text/x-patch
Size: 408 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20161213/ed905836/attachment.bin>

More information about the llvm-commits mailing list