<div dir="ltr">Grr.  Is there an easy way to disable this warning?</div><br><div class="gmail_quote"><div dir="ltr">On Thu, Dec 15, 2016 at 11:21 AM David Blaikie <<a href="mailto:dblaikie@gmail.com">dblaikie@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="gmail_msg">Build's a bit noisy:<br class="gmail_msg"><br class="gmail_msg"><div class="gmail_msg"><font face="monospace" class="gmail_msg">llvm/src/include/llvm/ADT/StringRef.h:851:22: warning: 'enable_if' is a clang extension [-Wgcc-compat]</font></div></div><div dir="ltr" class="gmail_msg"><div class="gmail_msg"><font face="monospace" class="gmail_msg">        __attribute((enable_if(__builtin_strlen(Str) == N - 1,</font></div></div><div dir="ltr" class="gmail_msg"><div class="gmail_msg"><font face="monospace" class="gmail_msg">                     ^</font></div><div class="gmail_msg"><font face="monospace" class="gmail_msg">1 warning generated.<br class="gmail_msg"><br class="gmail_msg">(I get a lot of those... )</font></div></div><div dir="ltr" class="gmail_msg"><br class="gmail_msg"><div class="gmail_quote gmail_msg"><div dir="ltr" class="gmail_msg">On Thu, Dec 15, 2016 at 11:13 AM Zachary Turner via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org" class="gmail_msg" target="_blank">llvm-commits@lists.llvm.org</a>> wrote:<br class="gmail_msg"></div><blockquote class="gmail_quote gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: zturner<br class="gmail_msg">
Date: Thu Dec 15 13:02:43 2016<br class="gmail_msg">
New Revision: 289853<br class="gmail_msg">
<br class="gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=289853&view=rev" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project?rev=289853&view=rev</a><br class="gmail_msg">
Log:<br class="gmail_msg">
[StringRef] Add enable-if to StringLiteral.<br class="gmail_msg">
<br class="gmail_msg">
to prevent StringLiteral from being created with a non-literal<br class="gmail_msg">
char array, clang has a macro enable_if() that can be used<br class="gmail_msg">
in such a way as to guarantee that the constructor is disabled<br class="gmail_msg">
unless the length fo the string can be computed at compile time.<br class="gmail_msg">
<br class="gmail_msg">
This only works on clang, but at least it should allow bots<br class="gmail_msg">
to catch abuse of StringLiteral.<br class="gmail_msg">
<br class="gmail_msg">
Differential Revision: <a href="https://reviews.llvm.org/D27780" rel="noreferrer" class="gmail_msg" target="_blank">https://reviews.llvm.org/D27780</a><br class="gmail_msg">
<br class="gmail_msg">
Modified:<br class="gmail_msg">
    llvm/trunk/include/llvm/ADT/StringRef.h<br class="gmail_msg">
<br class="gmail_msg">
Modified: llvm/trunk/include/llvm/ADT/StringRef.h<br class="gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/StringRef.h?rev=289853&r1=289852&r2=289853&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/StringRef.h?rev=289853&r1=289852&r2=289853&view=diff</a><br class="gmail_msg">
==============================================================================<br class="gmail_msg">
--- llvm/trunk/include/llvm/ADT/StringRef.h (original)<br class="gmail_msg">
+++ llvm/trunk/include/llvm/ADT/StringRef.h Thu Dec 15 13:02:43 2016<br class="gmail_msg">
@@ -838,22 +838,21 @@ namespace llvm {<br class="gmail_msg">
<br class="gmail_msg">
   /// A wrapper around a string literal that serves as a proxy for constructing<br class="gmail_msg">
   /// global tables of StringRefs with the length computed at compile time.<br class="gmail_msg">
-  /// Using this class with a non-literal char array is considered undefined<br class="gmail_msg">
-  /// behavior.  To prevent this, it is recommended that StringLiteral *only*<br class="gmail_msg">
-  /// be used in a constexpr context, as such:<br class="gmail_msg">
+  /// In order to avoid the invocation of a global constructor, StringLiteral<br class="gmail_msg">
+  /// should *only* be used in a constexpr context, as such:<br class="gmail_msg">
   ///<br class="gmail_msg">
   /// constexpr StringLiteral S("test");<br class="gmail_msg">
   ///<br class="gmail_msg">
-  /// Note: There is a subtle behavioral difference in the constructor of<br class="gmail_msg">
-  /// StringRef and StringLiteral, as illustrated below:<br class="gmail_msg">
-  ///<br class="gmail_msg">
-  /// constexpr StringLiteral S("a\0b");  // S.size() == 3<br class="gmail_msg">
-  /// StringRef S("a\0b");  // S.size() == 1<br class="gmail_msg">
-  ///<br class="gmail_msg">
   class StringLiteral : public StringRef {<br class="gmail_msg">
   public:<br class="gmail_msg">
     template <size_t N><br class="gmail_msg">
-    constexpr StringLiteral(const char (&Str)[N]) : StringRef(Str, N - 1) {}<br class="gmail_msg">
+    constexpr StringLiteral(const char (&Str)[N])<br class="gmail_msg">
+#if __has_attribute(enable_if)<br class="gmail_msg">
+        __attribute((enable_if(__builtin_strlen(Str) == N - 1,<br class="gmail_msg">
+                               "invalid string literal")))<br class="gmail_msg">
+#endif<br class="gmail_msg">
+        : StringRef(Str, N - 1) {<br class="gmail_msg">
+    }<br class="gmail_msg">
   };<br class="gmail_msg">
<br class="gmail_msg">
   /// @name StringRef Comparison Operators<br class="gmail_msg">
@@ -865,9 +864,7 @@ namespace llvm {<br class="gmail_msg">
   }<br class="gmail_msg">
<br class="gmail_msg">
   LLVM_ATTRIBUTE_ALWAYS_INLINE<br class="gmail_msg">
-  inline bool operator!=(StringRef LHS, StringRef RHS) {<br class="gmail_msg">
-    return !(LHS == RHS);<br class="gmail_msg">
-  }<br class="gmail_msg">
+  inline bool operator!=(StringRef LHS, StringRef RHS) { return !(LHS == RHS); }<br class="gmail_msg">
<br class="gmail_msg">
   inline bool operator<(StringRef LHS, StringRef RHS) {<br class="gmail_msg">
     return LHS.compare(RHS) == -1;<br class="gmail_msg">
<br class="gmail_msg">
<br class="gmail_msg">
_______________________________________________<br class="gmail_msg">
llvm-commits mailing list<br class="gmail_msg">
<a href="mailto:llvm-commits@lists.llvm.org" class="gmail_msg" target="_blank">llvm-commits@lists.llvm.org</a><br class="gmail_msg">
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" class="gmail_msg" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br class="gmail_msg">
</blockquote></div></div></blockquote></div>