aaron.ballman created this revision. aaron.ballman added reviewers: clang-language-wg, erichkeane, jyknight. Herald added a project: All. aaron.ballman requested review of this revision. Herald added a project: clang.
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. However, the recommended practice is just tricky enough to test, I wanted a second set of eyes on my test coverage to see if there's agreement I'm testing the right things and have come to the right conclusion. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D136942 Files: clang/test/C/C2x/n2322.c clang/www/c_status.html Index: clang/www/c_status.html =================================================================== --- clang/www/c_status.html +++ clang/www/c_status.html @@ -696,7 +696,15 @@ <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> Index: clang/test/C/C2x/n2322.c =================================================================== --- /dev/null +++ clang/test/C/C2x/n2322.c @@ -0,0 +1,45 @@ +// 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); +} +
Index: clang/www/c_status.html =================================================================== --- clang/www/c_status.html +++ clang/www/c_status.html @@ -696,7 +696,15 @@ <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> Index: clang/test/C/C2x/n2322.c =================================================================== --- /dev/null +++ clang/test/C/C2x/n2322.c @@ -0,0 +1,45 @@ +// 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); +} +
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits