Skip to content

Commit

Permalink
[C2x] Implement the unreachable macro for WG14 N2826
Browse files Browse the repository at this point in the history
This exposes __builtin_unreachable as the expansion for the unreachable
macro in C2x. I added this definition under __need_STDDEF_H_misc on the
assumption there is no need for a separate need macro to control adding
this.

Differential Revision: https://reviews.llvm.org/D143430
  • Loading branch information
AaronBallman committed Feb 15, 2023
1 parent d6ff080 commit a9797d7
Show file tree
Hide file tree
Showing 4 changed files with 34 additions and 1 deletion.
2 changes: 2 additions & 0 deletions clang/docs/ReleaseNotes.rst
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,8 @@ C Language Changes in Clang

C2x Feature Support
-------------------
- Implemented the ``unreachable`` macro in freestanding ``<stddef.h>`` for
`WG14 N2826 <https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2826.pdf>`_

C++ Language Changes in Clang
-----------------------------
Expand Down
5 changes: 5 additions & 0 deletions clang/lib/Headers/stddef.h
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,11 @@ using ::std::nullptr_t;
typedef typeof(nullptr) nullptr_t;
#endif /* defined(__STDC_VERSION__) && __STDC_VERSION__ >= 202000L */

#if defined(__need_STDDEF_H_misc) && defined(__STDC_VERSION__) && \
__STDC_VERSION__ >= 202000L
#define unreachable() __builtin_unreachable()
#endif /* defined(__need_STDDEF_H_misc) && >= C23 */

#if defined(__need_STDDEF_H_misc)
#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L) || \
(defined(__cplusplus) && __cplusplus >= 201103L)
Expand Down
26 changes: 26 additions & 0 deletions clang/test/C/C2x/n2826.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
// RUN: %clang_cc1 -ffreestanding -emit-llvm -o - -std=c2x %s | FileCheck %s
// RUN: %clang_cc1 -ffreestanding -std=c17 -verify %s

/* WG14 N2826: Clang 17
* Add annotations for unreachable control flow v2
*/
#include <stddef.h>

enum E {
Zero,
One,
Two,
};

int test(enum E e) {
switch (e) {
case Zero: return 0;
case One: return 1;
case Two: return 2;
}
unreachable(); // expected-error {{call to undeclared function 'unreachable'}}
}

// CHECK: switch i32 %0, label %[[EPILOG:.+]] [
// CHECK: [[EPILOG]]:
// CHECK-NEXT: unreachable
2 changes: 1 addition & 1 deletion clang/www/c_status.html
Original file line number Diff line number Diff line change
Expand Up @@ -1028,7 +1028,7 @@ <h2 id="c2x">C2x implementation status</h2>
<tr>
<td>Add annotations for unreachable control flow v2</td>
<td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2826.pdf">N2826</a></td>
<td class="none" align="center">No</td>
<td class="unreleased" align="center">Clang 17</td>
</tr>
<tr>
<td>Unicode Sequences More Than 21 Bits are a Constraint Violation r0</td>
Expand Down

0 comments on commit a9797d7

Please sign in to comment.