| Index: compiled/String.h | 
| diff --git a/compiled/String.h b/compiled/String.h | 
| index 70086f847b913460c906d285ff85c9f8013f8a67..5ee0d39a13bc4089a4d1751f44e3eb5bce88a8f6 100644 | 
| --- a/compiled/String.h | 
| +++ b/compiled/String.h | 
| @@ -76,14 +76,12 @@ protected: | 
| value_type* mBuf; | 
| size_type mLen; | 
| - explicit String(value_type* buf, size_type len, size_type flags) | 
| + constexpr explicit String(value_type* buf, size_type len, size_type flags) | 
| : mBuf(buf), mLen((len & LENGTH_MASK) | flags) | 
| { | 
| } | 
| - ~String() | 
| - { | 
| - } | 
| + ~String() = default; | 
| void reset(value_type* buf, size_type len, size_type flags) | 
| { | 
| @@ -92,17 +90,17 @@ protected: | 
| } | 
| public: | 
| - size_type length() const | 
| + constexpr size_type length() const | 
| { | 
| return mLen & LENGTH_MASK; | 
| } | 
| - bool empty() const | 
| + constexpr bool empty() const | 
| { | 
| return !(mLen & LENGTH_MASK); | 
| } | 
| - const value_type* data() const | 
| + constexpr const value_type* data() const | 
| { | 
| return mBuf; | 
| } | 
| @@ -113,7 +111,7 @@ public: | 
| return mBuf; | 
| } | 
| - const value_type& operator[](size_type pos) const | 
| + constexpr const value_type& operator[](size_type pos) const | 
| { | 
| return mBuf[pos]; | 
| } | 
| @@ -124,12 +122,12 @@ public: | 
| return mBuf[pos]; | 
| } | 
| - bool is_writable() const | 
| + constexpr bool is_writable() const | 
| { | 
| return (mLen & FLAGS_MASK) == READ_WRITE; | 
| } | 
| - bool equals(const String& other) const | 
| + constexpr bool equals(const String& other) const | 
| { | 
| if (length() != other.length()) | 
| return false; | 
| @@ -137,17 +135,17 @@ public: | 
| return std::memcmp(mBuf, other.mBuf, sizeof(value_type) * length()) == 0; | 
| } | 
| - bool operator==(const String& other) const | 
| + constexpr bool operator==(const String& other) const | 
| { | 
| return equals(other); | 
| } | 
| - bool operator!=(const String& other) const | 
| + constexpr bool operator!=(const String& other) const | 
| { | 
| return !equals(other); | 
| } | 
| - size_type find(value_type c, size_type pos = 0) const | 
| + constexpr size_type find(value_type c, size_type pos = 0) const | 
| { | 
| for (size_type i = pos; i < length(); ++i) | 
| if (mBuf[i] == c) | 
| @@ -155,12 +153,12 @@ public: | 
| return npos; | 
| } | 
| - size_type find(const String& str, size_type pos = 0) const | 
| + constexpr size_type find(const String& str, size_type pos = 0) const | 
| { | 
| return find(str.mBuf, pos, str.length()); | 
| } | 
| - size_type find(const value_type* str, size_type pos, size_type count) const | 
| + constexpr size_type find(const value_type* str, size_type pos, size_type count) const | 
| { | 
| if (pos > LENGTH_MASK || pos + count > length()) | 
| return npos; | 
| @@ -180,7 +178,7 @@ public: | 
| return npos; | 
| } | 
| - size_type rfind(value_type c, size_type pos = npos) const | 
| + constexpr size_type rfind(value_type c, size_type pos = npos) const | 
| { | 
| if (length() == 0) | 
| return npos; | 
| @@ -194,12 +192,12 @@ public: | 
| return npos; | 
| } | 
| - bool is_invalid() const | 
| + constexpr bool is_invalid() const | 
| { | 
| return (mLen & FLAGS_MASK) == INVALID; | 
| } | 
| - bool is_deleted() const | 
| + constexpr bool is_deleted() const | 
| { | 
| return (mLen & FLAGS_MASK) == DELETED; | 
| } | 
| @@ -245,17 +243,23 @@ inline std::ostream& operator<<(std::ostream& os, const String& str) | 
| class DependentString : public String | 
| { | 
| public: | 
| - explicit DependentString() | 
| + constexpr explicit DependentString() | 
| : String(nullptr, 0, INVALID) | 
| { | 
| } | 
| + template <int N1> | 
| + constexpr explicit DependentString(const value_type (&buf)[N1]) | 
| + : String(const_cast<value_type*>(buf), N1 - 1, READ_ONLY) | 
| + { | 
| + } | 
| + | 
| explicit DependentString(value_type* buf, size_type len) | 
| : String(buf, len, READ_WRITE) | 
| { | 
| } | 
| - explicit DependentString(const value_type* buf, size_type len) | 
| + constexpr explicit DependentString(const value_type* buf, size_type len) | 
| : String(const_cast<value_type*>(buf), len, READ_ONLY) | 
| { | 
| } | 
| @@ -313,7 +317,7 @@ inline std::ostream& operator<<(std::ostream& os, const DependentString& str) | 
| } | 
| #endif | 
| -inline DependentString operator "" _str(const String::value_type* str, | 
| +constexpr DependentString operator "" _str(const String::value_type* str, | 
| String::size_type len) | 
| { | 
| return DependentString(str, len); |