[clang] e36ec2f - [C99] Claim conformance to digraphs/iso646

Aaron Ballman via cfe-commits cfe-commits at lists.llvm.org
Wed Mar 27 11:57:31 PDT 2024


Author: Aaron Ballman
Date: 2024-03-27T14:57:21-04:00
New Revision: e36ec2f40c7ea998dd11a485b01c32f50b7bf738

URL: https://github.com/llvm/llvm-project/commit/e36ec2f40c7ea998dd11a485b01c32f50b7bf738
DIFF: https://github.com/llvm/llvm-project/commit/e36ec2f40c7ea998dd11a485b01c32f50b7bf738.diff

LOG: [C99] Claim conformance to digraphs/iso646

Added: 
    clang/test/C/C99/digraphs.c

Modified: 
    clang/www/c_status.html

Removed: 
    


################################################################################
diff  --git a/clang/test/C/C99/digraphs.c b/clang/test/C/C99/digraphs.c
new file mode 100644
index 00000000000000..870a441118161a
--- /dev/null
+++ b/clang/test/C/C99/digraphs.c
@@ -0,0 +1,90 @@
+// RUN: %clang_cc1 -verify -ffreestanding %s
+
+/* WG14 ???: yes
+ * restricted character set support via digraphs and <iso646.h>
+ *
+ * NB: I cannot find a definitive document number associated with the feature,
+ * which was pulled from the editor's report in the C99 front matter. However,
+ * based on discussion in the C99 rationale document, I believe this is
+ * referring to features added by AMD1 to support ISO 646 and digraphs.
+ */
+
+// Validate that we provide iso646.h in freestanding mode.
+#include <iso646.h>
+
+// Validate that we define all the expected macros and their expected
+// expansions (when suitable for a constant expression) as well.
+#ifndef and
+#error "missing and"
+#else
+_Static_assert((1 and 1) == (1 && 1), "");
+#endif
+
+#ifndef and_eq
+#error "missing and_eq"
+#endif
+
+#ifndef bitand
+#error "missing bitand"
+#else
+_Static_assert((1 bitand 3) == (1 & 3), "");
+#endif
+
+#ifndef bitor
+#error "missing bitor"
+#else
+_Static_assert((1 bitor 2) == (1 | 2), "");
+#endif
+
+#ifndef compl
+#error "missing compl"
+#else
+_Static_assert((compl 0) == (~0), "");
+#endif
+
+#ifndef not
+#error "missing not"
+#else
+_Static_assert((not 12) == (!12), "");
+#endif
+
+#ifndef not_eq
+#error "missing not_eq"
+#else
+_Static_assert((0 not_eq 12) == (0 != 12), "");
+#endif
+
+#ifndef or
+#error "missing or"
+#else
+// This intentionally diagnoses use of '||' only, because the user likely did
+// not confuse the operator when using 'or' instead.
+_Static_assert((0 or 12) == (0 || 12), ""); // expected-warning {{use of logical '||' with constant operand}} \
+                                               expected-note {{use '|' for a bitwise operation}}
+#endif
+
+#ifndef or_eq
+#error "missing or_eq"
+#endif
+
+#ifndef xor
+#error "missing xor"
+#else
+_Static_assert((1 xor 3) == (1 ^ 3), "");
+#endif
+
+#ifndef xor_eq
+#error "missing xor_eq"
+#endif
+
+// Validate that digraphs behave the same as their expected counterparts. The
+// definition should match the declaration in every way except spelling.
+#define DI_NAME(f, b) f %:%: b
+#define STD_NAME(f, b) f ## b
+void DI_NAME(foo, bar)(int (*array)<: 0 :>);
+void STD_NAME(foo, bar)(int (*array)[0]) {}
+
+#define DI_STR(f) %:f
+#define STD_STR(f) #f
+_Static_assert(__builtin_strcmp(DI_STR(testing), STD_STR(testing)) == 0, "");
+

diff  --git a/clang/www/c_status.html b/clang/www/c_status.html
index 60f48aba2788e0..55aca94cd2ecd3 100644
--- a/clang/www/c_status.html
+++ b/clang/www/c_status.html
@@ -105,7 +105,7 @@ <h2 id="c99">C99 implementation status</h2>
     <tr>
       <td>restricted character set support via digraphs and <iso646.h></td>
       <td>Unknown</td>
-      <td class="unknown" align="center">Unknown</td>
+      <td class="full" align="center">Yes</td>
     </tr>
     <tr>
       <td>more precise aliasing rules via effective type</td>


        


More information about the cfe-commits mailing list