[llvm] r289853 - [StringRef] Add enable-if to StringLiteral.

David Majnemer via llvm-commits llvm-commits at lists.llvm.org
Thu Dec 15 11:27:01 PST 2016


On Thu, Dec 15, 2016 at 11:24 AM, Zachary Turner via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

> #pragma clang diagnostic ignored "-Wgcc-compat"?
>

I'd bracket it like so:
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wgcc-compat"
[ ... ]
#pragma clang diagnostic pop


>
> On Thu, Dec 15, 2016 at 11:23 AM Zachary Turner <zturner at google.com>
> wrote:
>
>> Grr.  Is there an easy way to disable this warning?
>>
>> On Thu, Dec 15, 2016 at 11:21 AM David Blaikie <dblaikie at gmail.com>
>> wrote:
>>
>> Build's a bit noisy:
>>
>> llvm/src/include/llvm/ADT/StringRef.h:851:22: warning: 'enable_if' is a
>> clang extension [-Wgcc-compat]
>>         __attribute((enable_if(__builtin_strlen(Str) == N - 1,
>>                      ^
>> 1 warning generated.
>>
>> (I get a lot of those... )
>>
>> On Thu, Dec 15, 2016 at 11:13 AM Zachary Turner via llvm-commits <
>> llvm-commits at lists.llvm.org> wrote:
>>
>> Author: zturner
>> Date: Thu Dec 15 13:02:43 2016
>> New Revision: 289853
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=289853&view=rev
>> Log:
>> [StringRef] Add enable-if to StringLiteral.
>>
>> to prevent StringLiteral from being created with a non-literal
>> char array, clang has a macro enable_if() that can be used
>> in such a way as to guarantee that the constructor is disabled
>> unless the length fo the string can be computed at compile time.
>>
>> This only works on clang, but at least it should allow bots
>> to catch abuse of StringLiteral.
>>
>> Differential Revision: https://reviews.llvm.org/D27780
>>
>> Modified:
>>     llvm/trunk/include/llvm/ADT/StringRef.h
>>
>> Modified: llvm/trunk/include/llvm/ADT/StringRef.h
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/
>> llvm/ADT/StringRef.h?rev=289853&r1=289852&r2=289853&view=diff
>> ============================================================
>> ==================
>> --- llvm/trunk/include/llvm/ADT/StringRef.h (original)
>> +++ llvm/trunk/include/llvm/ADT/StringRef.h Thu Dec 15 13:02:43 2016
>> @@ -838,22 +838,21 @@ namespace llvm {
>>
>>    /// 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:
>> +  /// In order to avoid the invocation of a global constructor,
>> 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 <size_t N>
>> -    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) {
>> +    }
>>    };
>>
>>    /// @name StringRef Comparison Operators
>> @@ -865,9 +864,7 @@ namespace llvm {
>>    }
>>
>>    LLVM_ATTRIBUTE_ALWAYS_INLINE
>> -  inline bool operator!=(StringRef LHS, StringRef RHS) {
>> -    return !(LHS == RHS);
>> -  }
>> +  inline bool operator!=(StringRef LHS, StringRef RHS) { return !(LHS ==
>> RHS); }
>>
>>    inline bool operator<(StringRef LHS, StringRef RHS) {
>>      return LHS.compare(RHS) == -1;
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>
>>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20161215/154e2e0d/attachment.html>


More information about the llvm-commits mailing list