<div dir="ltr">Isn't this unnecessarily annoying to users? You have the same syntax to use the attributes, and the attributes are expected to be compatible when named the same way, but you can't use the same #if conditional to check for availability, when writing a header intended to work in both modes?</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Nov 25, 2019 at 5:35 PM Aaron Ballman via cfe-commits <<a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><br>
Author: Aaron Ballman<br>
Date: 2019-11-25T17:35:12-05:00<br>
New Revision: d930ed1acc0ea49d4b3aae7e95b4c6d9cd310578<br>
<br>
URL: <a href="https://github.com/llvm/llvm-project/commit/d930ed1acc0ea49d4b3aae7e95b4c6d9cd310578" rel="noreferrer" target="_blank">https://github.com/llvm/llvm-project/commit/d930ed1acc0ea49d4b3aae7e95b4c6d9cd310578</a><br>
DIFF: <a href="https://github.com/llvm/llvm-project/commit/d930ed1acc0ea49d4b3aae7e95b4c6d9cd310578.diff" rel="noreferrer" target="_blank">https://github.com/llvm/llvm-project/commit/d930ed1acc0ea49d4b3aae7e95b4c6d9cd310578.diff</a><br>
<br>
LOG: Disallow use of __has_c_attribute in C++ mode.<br>
<br>
__has_cpp_attribute is not available in C mode, and __has_c_attribute<br>
should not be available in C++ mode. This also adds a test to<br>
demonstrate that we properly handle scoped attribute tokens even in C<br>
mode.<br>
<br>
Added: <br>
    clang/test/Preprocessor/has_c_attribute.cpp<br>
<br>
Modified: <br>
    clang/lib/Lex/PPMacroExpansion.cpp<br>
    clang/test/Preprocessor/has_c_attribute.c<br>
<br>
Removed: <br>
<br>
<br>
<br>
################################################################################<br>
diff  --git a/clang/lib/Lex/PPMacroExpansion.cpp b/clang/lib/Lex/PPMacroExpansion.cpp<br>
index e6e00b1c1700..a69c4dbb3a2a 100644<br>
--- a/clang/lib/Lex/PPMacroExpansion.cpp<br>
+++ b/clang/lib/Lex/PPMacroExpansion.cpp<br>
@@ -370,7 +370,11 @@ void Preprocessor::RegisterBuiltinMacros() {<br>
   Ident__has_extension    = RegisterBuiltinMacro(*this, "__has_extension");<br>
   Ident__has_builtin      = RegisterBuiltinMacro(*this, "__has_builtin");<br>
   Ident__has_attribute    = RegisterBuiltinMacro(*this, "__has_attribute");<br>
-  Ident__has_c_attribute  = RegisterBuiltinMacro(*this, "__has_c_attribute");<br>
+  if (!LangOpts.CPlusPlus)<br>
+    Ident__has_c_attribute = RegisterBuiltinMacro(*this, "__has_c_attribute");<br>
+  else<br>
+    Ident__has_c_attribute = nullptr;<br>
+<br>
   Ident__has_declspec = RegisterBuiltinMacro(*this, "__has_declspec_attribute");<br>
   Ident__has_include      = RegisterBuiltinMacro(*this, "__has_include");<br>
   Ident__has_include_next = RegisterBuiltinMacro(*this, "__has_include_next");<br>
<br>
diff  --git a/clang/test/Preprocessor/has_c_attribute.c b/clang/test/Preprocessor/has_c_attribute.c<br>
index 843a67a2646c..f8b0b364faa5 100644<br>
--- a/clang/test/Preprocessor/has_c_attribute.c<br>
+++ b/clang/test/Preprocessor/has_c_attribute.c<br>
@@ -1,4 +1,5 @@<br>
 // RUN: %clang_cc1 -fdouble-square-bracket-attributes -std=c11 -E %s -o - | FileCheck %s<br>
+// RUN: %clang_cc1 -std=c2x -E %s -o - | FileCheck %s<br>
<br>
 // CHECK: has_fallthrough<br>
 #if __has_c_attribute(fallthrough)<br>
@@ -14,3 +15,8 @@<br>
 #if __has_c_attribute(__nodiscard__)<br>
   int has_nodiscard_underscore();<br>
 #endif<br>
+<br>
+// CHECK: has_clang_annotate<br>
+#if __has_c_attribute(clang::annotate)<br>
+  int has_clang_annotate();<br>
+#endif<br>
<br>
diff  --git a/clang/test/Preprocessor/has_c_attribute.cpp b/clang/test/Preprocessor/has_c_attribute.cpp<br>
new file mode 100644<br>
index 000000000000..0bde73067178<br>
--- /dev/null<br>
+++ b/clang/test/Preprocessor/has_c_attribute.cpp<br>
@@ -0,0 +1,8 @@<br>
+// RUN: %clang_cc1 -std=c++11 %s -verify<br>
+<br>
+#if __has_c_attribute(fallthrough) // expected-error {{function-like macro '__has_c_attribute' is not defined}}<br>
+#endif<br>
+<br>
+#if __has_c_attribute(gnu::transparent_union) // expected-error {{function-like macro '__has_c_attribute' is not defined}}<br>
+#endif<br>
+<br>
<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits</a><br>
</blockquote></div>