[PATCH] D120244: [clang][sema] Enable first-class bool support for C2x
Timm Bäder via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Sun Mar 6 00:38:20 PST 2022
tbaeder updated this revision to Diff 413279.
tbaeder marked 3 inline comments as done.
tbaeder added a comment.
Thanks for the links to the papers. What's the best way of updating https://clang.llvm.org/c_status.html#c2x with the new papers?
I added the changes to `stdbool.h`, but I haven't been able to come up with a good way of testing them...
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D120244/new/
https://reviews.llvm.org/D120244
Files:
clang/docs/ReleaseNotes.rst
clang/lib/Frontend/CompilerInvocation.cpp
clang/lib/Headers/stdbool.h
clang/test/Sema/c2x-bool.c
Index: clang/test/Sema/c2x-bool.c
===================================================================
--- /dev/null
+++ clang/test/Sema/c2x-bool.c
@@ -0,0 +1,41 @@
+// RUN: %clang_cc1 -std=c2x -fsyntax-only -verify %s
+
+_Static_assert(_Generic(true, _Bool : 1, default: 0));
+_Static_assert(_Generic(false, _Bool : 1, default: 0));
+
+_Static_assert(_Generic(true, bool : 1, default: 0));
+_Static_assert(_Generic(false, bool : 1, default: 0));
+
+_Static_assert(_Generic(true, bool : true, default: false));
+_Static_assert(_Generic(false, bool : true, default: false));
+
+_Static_assert(true == (bool)+1);
+_Static_assert(false == (bool)+0);
+
+_Static_assert(_Generic(+true, bool : 0, unsigned int : 0, signed int : 1, default : 0));
+
+struct S {
+ bool b : 1;
+} s;
+_Static_assert(_Generic(+s.b, bool : 0, unsigned int : 0, signed int : 1, default : 0));
+
+static void *f = false; // expected-warning {{to null from a constant boolean expression}}
+static int one = true;
+static int zero = false;
+
+static void do_work() {
+ char *str = "Foo";
+ str[false] = 'f';
+ str[true] = 'f';
+
+ char c1[true];
+ char c2[false];
+}
+
+#if true != 1
+#error true should be 1 in the preprocessor
+#endif
+
+#if false != 0
+#error false should be 0 in the preprocessor
+#endif
Index: clang/lib/Headers/stdbool.h
===================================================================
--- clang/lib/Headers/stdbool.h
+++ clang/lib/Headers/stdbool.h
@@ -10,6 +10,8 @@
#ifndef __STDBOOL_H
#define __STDBOOL_H
+/* true, false and bool are first-class keywords in C2x */
+#if __STDC_VERSION__ < 202000L
/* Don't define bool, true, and false in C++, except as a GNU extension. */
#ifndef __cplusplus
#define bool _Bool
@@ -20,9 +22,10 @@
#define _Bool bool
#if __cplusplus < 201103L
/* For C++98, define bool, false, true as a GNU extension. */
-#define bool bool
+#define bool bool
#define false false
-#define true true
+#define true true
+#endif
#endif
#endif
Index: clang/lib/Frontend/CompilerInvocation.cpp
===================================================================
--- clang/lib/Frontend/CompilerInvocation.cpp
+++ clang/lib/Frontend/CompilerInvocation.cpp
@@ -3249,8 +3249,8 @@
Opts.RenderScript = IK.getLanguage() == Language::RenderScript;
- // OpenCL and C++ both have bool, true, false keywords.
- Opts.Bool = Opts.OpenCL || Opts.CPlusPlus;
+ // OpenCL, C++ and C2x have bool, true, false keywords.
+ Opts.Bool = Opts.OpenCL || Opts.CPlusPlus || Opts.C2x;
// OpenCL has half keyword
Opts.Half = Opts.OpenCL;
Index: clang/docs/ReleaseNotes.rst
===================================================================
--- clang/docs/ReleaseNotes.rst
+++ clang/docs/ReleaseNotes.rst
@@ -111,6 +111,7 @@
- Implemented `WG14 N2674 The noreturn attribute <http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2764.pdf>`_.
- Implemented `WG14 N2418 Adding the u8 character prefix <http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2418.pdf>`_.
+- Implemented `WG14 N2935 Make false and true first-class language features <http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2935.pdf>`_.
C++ Language Changes in Clang
-----------------------------
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D120244.413279.patch
Type: text/x-patch
Size: 3186 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20220306/89d21328/attachment.bin>
More information about the cfe-commits
mailing list