Index: include/llvm/ADT/StringRef.h =================================================================== --- include/llvm/ADT/StringRef.h +++ include/llvm/ADT/StringRef.h @@ -838,22 +838,22 @@ /// A wrapper around a string literal that serves as a proxy for constructing /// global tables of StringRefs with the length computed at compile time. - /// Using this class with a non-literal char array is considered undefined - /// behavior. To prevent this, it is recommended that StringLiteral *only* - /// be used in a constexpr context, as such: + /// StringLiteral should *only* be used in a constexpr context, as such: /// /// constexpr StringLiteral S("test"); /// - /// Note: There is a subtle behavioral difference in the constructor of - /// StringRef and StringLiteral, as illustrated below: - /// - /// constexpr StringLiteral S("a\0b"); // S.size() == 3 - /// StringRef S("a\0b"); // S.size() == 1 - /// class StringLiteral : public StringRef { public: template - constexpr StringLiteral(const char (&Str)[N]) : StringRef(Str, N - 1) {} + constexpr StringLiteral(const char (&Str)[N]) +#if __has_attribute(enable_if) + __attribute((enable_if(__builtin_strlen(Str) == N - 1, + "invalid string literal"))) +#endif + : StringRef(Str, N - 1) { + } + + const char *c_str() const { return data(); } }; /// @name StringRef Comparison Operators