Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Clang] Mark WG14 N2939 (Identifier Syntax Fixes) as available in Clang 15 #74666

Merged
merged 2 commits into from
Dec 7, 2023

Conversation

tahonermann
Copy link
Contributor

WG14 N2939 (Identifier Syntax Fixes) corrects a grammar issue in the C standard but does not otherwise change intended behavior. This change updates the C23 status to note this paper as implemented as of Clang 15; the release in which support for N2836 (Identifier Syntax using Unicode Standard Annex 31) was implemented.

…ng 15

WG14 N2939 (Identifier Syntax Fixes) corrects a grammar issue in the C
standard but does not otherwise change intended behavior. This change
updates the C23 status to note this paper as implemented as of Clang 15;
the release in which support for N2836 (Identifier Syntax using Unicode
Standard Annex 31) was implemented.
@tahonermann tahonermann self-assigned this Dec 6, 2023
@llvmbot llvmbot added the clang Clang issues not falling into any other category label Dec 6, 2023
@llvmbot
Copy link
Collaborator

llvmbot commented Dec 6, 2023

@llvm/pr-subscribers-clang

Author: Tom Honermann (tahonermann)

Changes

WG14 N2939 (Identifier Syntax Fixes) corrects a grammar issue in the C standard but does not otherwise change intended behavior. This change updates the C23 status to note this paper as implemented as of Clang 15; the release in which support for N2836 (Identifier Syntax using Unicode Standard Annex 31) was implemented.


Full diff: https://github.com/llvm/llvm-project/pull/74666.diff

2 Files Affected:

  • (added) clang/test/C/C2x/n2836_n2939.c (+83)
  • (modified) clang/www/c_status.html (+1-1)
diff --git a/clang/test/C/C2x/n2836_n2939.c b/clang/test/C/C2x/n2836_n2939.c
new file mode 100644
index 0000000000000..14095aa53456b
--- /dev/null
+++ b/clang/test/C/C2x/n2836_n2939.c
@@ -0,0 +1,83 @@
+// RUN: %clang_cc1 -x c -std=c2x -fsyntax-only -verify %s
+// RUN: %clang_cc1 -x c -std=c2x -E -DPP_ONLY=1 %s | FileCheck %s --strict-whitespace
+
+/* WG14 N2863: Clang 15
+ *   Identifier Syntax using Unicode Standard Annex 31
+ */
+
+/* WG14 N2939: Clang 15
+ *   Identifier Syntax Fixes
+ */
+
+// Some of the tests below are derived from clang/test/Lexer/unicode.c.
+
+// This file contains Unicode characters; please do not "fix" them!
+
+// No diagnostics for pragma directives.
+#pragma mark ¡Unicode!
+
+// lone non-identifier characters are allowed in preprocessing.
+#define COPYRIGHT Copyright © 2012
+#define XSTR(X) #X
+#define STR(X) XSTR(X)
+
+static const char *copyright = STR(COPYRIGHT); // no-warning
+// CHECK: static const char *copyright = "Copyright © {{2012}}";
+
+#if PP_ONLY
+COPYRIGHT
+// CHECK: Copyright © {{2012}}
+#endif
+
+// The characters in the following identifiers are no longer valid as either
+// start or continuation characters as of C23. These are taken from section 1
+// of N2836.
+extern int \N{CONSTRUCTION WORKER};  // expected-error {{expected identifier or '('}}
+extern int X\N{CONSTRUCTION WORKER}; // expected-error {{character <U+1F477> not allowed in an identifier}}
+extern int \U0001F477;  // expected-error {{expected identifier or '('}}
+extern int X\U0001F477; // expected-error {{character <U+1F477> not allowed in an identifier}}
+extern int 👷;  // expected-error {{unexpected character <U+1F477>}} \
+                // expected-warning {{declaration does not declare anything}}
+extern int X👷; // expected-error {{character <U+1F477> not allowed in an identifier}}
+extern int 🕐;  // expected-error {{unexpected character <U+1F550>}} \
+                // expected-warning {{declaration does not declare anything}}
+extern int X🕐; // expected-error {{character <U+1F550> not allowed in an identifier}}
+extern int 💀;  // expected-error {{unexpected character <U+1F480>}} \
+                // expected-warning {{declaration does not declare anything}}
+extern int X💀; // expected-error {{character <U+1F480> not allowed in an identifier}}
+extern int 👊;  // expected-error {{unexpected character <U+1F44A>}} \
+                // expected-warning {{declaration does not declare anything}}
+extern int X👊; // expected-error {{character <U+1F44A> not allowed in an identifier}}
+extern int 🚀;  // expected-error {{unexpected character <U+1F680>}} \
+                // expected-warning {{declaration does not declare anything}}
+extern int X🚀; // expected-error {{character <U+1F680> not allowed in an identifier}}
+extern int 😀;  // expected-error {{unexpected character <U+1F600>}} \
+                // expected-warning {{declaration does not declare anything}}
+extern int X😀; // expected-error {{character <U+1F600> not allowed in an identifier}}
+
+// The characters in the following identifiers are not allowed as start
+// characters, but are allowed as continuation characters.
+extern int \N{ARABIC-INDIC DIGIT ZERO}; // expected-error {{expected identifier or '('}}
+extern int X\N{ARABIC-INDIC DIGIT ZERO};
+extern int \u0661; // expected-error {{expected identifier or '('}}
+extern int X\u0661;
+extern int ٢;  // expected-error {{character <U+0662> not allowed at the start of an identifier}} \\
+               // expected-warning {{declaration does not declare anything}}
+extern int X٠;
+
+// The characters in the following identifiers are not valid start or
+// continuation characters in the standard, but are accepted as a conforming
+// extension.
+extern int \N{SUPERSCRIPT ZERO};  // expected-error {{expected identifier or '('}}
+extern int X\N{SUPERSCRIPT ZERO}; // expected-warning {{mathematical notation character <U+2070> in an identifier is a Clang extension}}
+extern int \u00B9;  // expected-error {{expected identifier or '('}}
+extern int X\u00B9; // expected-warning {{mathematical notation character <U+00B9> in an identifier is a Clang extension}}
+extern int ²;  // expected-error {{character <U+00B2> not allowed at the start of an identifier}} \\
+               // expected-warning {{declaration does not declare anything}}
+extern int X²; // expected-warning {{mathematical notation character <U+00B2> in an identifier is a Clang extension}}
+extern int \N{PARTIAL DIFFERENTIAL};  // expected-warning {{mathematical notation character <U+2202> in an identifier is a Clang extension}}
+extern int X\N{PARTIAL DIFFERENTIAL}; // expected-warning {{mathematical notation character <U+2202> in an identifier is a Clang extension}}
+extern int \u2207;  // expected-warning {{mathematical notation character <U+2207> in an identifier is a Clang extension}}
+extern int X\u2207; // expected-warning {{mathematical notation character <U+2207> in an identifier is a Clang extension}}
+extern int ∞;  // expected-warning {{mathematical notation character <U+221E> in an identifier is a Clang extension}}
+extern int X∞; // expected-warning {{mathematical notation character <U+221E> in an identifier is a Clang extension}}
diff --git a/clang/www/c_status.html b/clang/www/c_status.html
index 91cae138074b3..47acb1f87b8e3 100644
--- a/clang/www/c_status.html
+++ b/clang/www/c_status.html
@@ -1151,7 +1151,7 @@ <h2 id="c2x">C23 implementation status</h2>
     <tr>
       <td>Identifier syntax fixes</td>
       <td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2939.pdf">N2939</a></td>
-      <td class="unknown" align="center">Unknown</td>
+      <td class="full" align="center">Clang 15</td>
     </tr>
     <tr>
       <td>Remove trigraphs??!</td>

Copy link
Contributor

@cor3ntin cor3ntin left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

Copy link
Collaborator

@AaronBallman AaronBallman left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM aside from a typo in a comment.

clang/test/C/C2x/n2836_n2939.c Outdated Show resolved Hide resolved
@tahonermann tahonermann merged commit 53b4689 into llvm:main Dec 7, 2023
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
clang Clang issues not falling into any other category
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

4 participants