[clang] f1c9ef3 - Add test coverage for WG14 N2322

Aaron Ballman via cfe-commits cfe-commits at lists.llvm.org
Fri Oct 28 09:46:49 PDT 2022


Author: Aaron Ballman
Date: 2022-10-28T12:45:56-04:00
New Revision: f1c9ef311fa677992798d609b0445f1d7311a8f2

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

LOG: Add test coverage for WG14 N2322

The changes in this paper add a new recommended practice. I had
originally marked Clang as supporting this paper because we're not
obligated to follow a recommended practice. However, in retrospect, it
seems more useful to document whether we implement the recommendation
or not. This adds a test for those changes.

Added: 
    clang/test/C/C2x/n2322.c

Modified: 
    clang/www/c_status.html

Removed: 
    


################################################################################
diff  --git a/clang/test/C/C2x/n2322.c b/clang/test/C/C2x/n2322.c
new file mode 100644
index 0000000000000..c5ac788fb6ed3
--- /dev/null
+++ b/clang/test/C/C2x/n2322.c
@@ -0,0 +1,51 @@
+// RUN: %clang_cc1 -std=c2x -ast-dump %s | FileCheck %s
+
+/* WG14 N2322: partial
+ * Preprocessor line numbers unspecified
+ */
+void n2322() {
+  // The line number associated with a pp-token should be the line number of
+  // the first character of the pp-token.
+  "this string literal  \
+   spans multiple lines \
+   before terminating";
+// CHECK: ImplicitCastExpr {{.*}} <line:9
+// CHECK-NEXT: StringLiteral {{.*}} <col:3>
+
+  // The line number associated with a pp-directive should be the line number
+  // of the line with the first # token.
+  // Possible FIXME: The AST node should be on line 1002 if we take the line
+  // number to be associated with the first # token. However, this relies on an
+  // interpretation of the standard definition of "presumed line" to be before
+  // line splices are removed. The standard leaves this unspecified, so this
+  // may not represent an actual issue.
+  #\
+  line\
+  1000
+  "string literal";
+// CHECK: ImplicitCastExpr {{.*}} <line:1000
+// CHECK: StringLiteral {{.*}} <col:3>
+
+  // The line number associated with a macro invocation should be the line
+  // number of the first character of the macro name in the invocation.
+  //
+  // Reset the line number to make it easier to understand the next test.
+  // FIXME: The line number should be 2005 (first letter of the macro name) and
+  // not 2007 (closing parenthesis of the macro invocation).
+  #line 2000
+  #define F( \
+    )        \
+_\
+_LINE__
+
+  _Static_assert(F(\
+  \
+  ) == 2007);
+
+  // Reset the line number again for ease.
+  #line 2000
+  _Static_assert(2001 == \
+__LI\
+NE__\
+  );
+}

diff  --git a/clang/www/c_status.html b/clang/www/c_status.html
index d2cefc87dbd35..ab668b630c355 100644
--- a/clang/www/c_status.html
+++ b/clang/www/c_status.html
@@ -696,7 +696,15 @@ <h2 id="c2x">C2x implementation status</h2>
     <tr>
       <td>Preprocessor line numbers unspecified</td>
       <td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2322.htm">N2322</a></td>
-      <td class="full" align="center">Yes</td>
+      <td class="partial" align="center">
+        <details><summary>Partial</summary>
+        The line number associated with a macro invocation is not the line
+        number of the first character of the macro name in the invocation.
+        Additionally, Clang may not associate the line number of a pp-directive
+        with the first <code>#</code> token. As these are recommended practices
+        and not normative requirements, Clang's behavior is still conforming.
+        </details>
+      </td>
     </tr>
     <tr>
       <td>deprecated attribute</td>


        


More information about the cfe-commits mailing list