[clang] 54fcf3e - [clang] Implement P3176R1: The Oxford variadic comma (#117524)
via cfe-commits
cfe-commits at lists.llvm.org
Mon Dec 2 00:53:58 PST 2024
Author: antangelo
Date: 2024-12-02T03:53:55-05:00
New Revision: 54fcf3ec26ad192e91b6ac924f6d3eb562e3647d
URL: https://github.com/llvm/llvm-project/commit/54fcf3ec26ad192e91b6ac924f6d3eb562e3647d
DIFF: https://github.com/llvm/llvm-project/commit/54fcf3ec26ad192e91b6ac924f6d3eb562e3647d.diff
LOG: [clang] Implement P3176R1: The Oxford variadic comma (#117524)
Emit a deprecation warning when a variadic parameter in a
parameter-declaration-clause is not preceded by a comma for C++26.
Added:
clang/test/Parser/cxx2c-oxford-variadic-comma.cpp
Modified:
clang/docs/ReleaseNotes.rst
clang/include/clang/Basic/DiagnosticGroups.td
clang/include/clang/Basic/DiagnosticParseKinds.td
clang/lib/Parse/ParseDecl.cpp
clang/test/CXX/drs/cwg722.cpp
clang/www/cxx_status.html
Removed:
################################################################################
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 57be1222734eed..e73640033f9774 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -256,6 +256,8 @@ C++2c Feature Support
- Added the ``__builtin_is_within_lifetime`` builtin, which supports
`P2641R4 Checking if a union alternative is active <https://wg21.link/p2641r4>`_
+- Implemented `P3176R1 The Oxford variadic comma <https://wg21.link/P3176R1>`_
+
C++23 Feature Support
^^^^^^^^^^^^^^^^^^^^^
- Removed the restriction to literal types in constexpr functions in C++23 mode.
diff --git a/clang/include/clang/Basic/DiagnosticGroups.td b/clang/include/clang/Basic/DiagnosticGroups.td
index 438655a7eaca7b..ac0e178d1cb416 100644
--- a/clang/include/clang/Basic/DiagnosticGroups.td
+++ b/clang/include/clang/Basic/DiagnosticGroups.td
@@ -211,6 +211,7 @@ def DeprecatedWritableStr : DiagGroup<"deprecated-writable-strings",
[CXX11CompatDeprecatedWritableStr]>;
def DeprecatedPragma : DiagGroup<"deprecated-pragma">;
def DeprecatedType : DiagGroup<"deprecated-type">;
+def DeprecatedMissingCommaVariadicParam : DiagGroup<"deprecated-missing-comma-variadic-parameter">;
// FIXME: Why is DeprecatedImplementations not in this group?
def Deprecated : DiagGroup<"deprecated", [DeprecatedAnonEnumEnumConversion,
DeprecatedArrayCompare,
@@ -235,7 +236,8 @@ def Deprecated : DiagGroup<"deprecated", [DeprecatedAnonEnumEnumConversion,
DeprecatedType,
DeprecatedVolatile,
DeprecatedWritableStr,
- DeprecatedRedundantConstexprStaticDef
+ DeprecatedRedundantConstexprStaticDef,
+ DeprecatedMissingCommaVariadicParam
]>,
DiagCategory<"Deprecations">;
diff --git a/clang/include/clang/Basic/DiagnosticParseKinds.td b/clang/include/clang/Basic/DiagnosticParseKinds.td
index 77bf08453dea51..9fa8d5901bd0a5 100644
--- a/clang/include/clang/Basic/DiagnosticParseKinds.td
+++ b/clang/include/clang/Basic/DiagnosticParseKinds.td
@@ -413,6 +413,9 @@ def err_function_scope_depth_exceeded : Error<
"function scope depth exceeded maximum of %0">, DefaultFatal;
def err_missing_comma_before_ellipsis : Error<
"C requires a comma prior to the ellipsis in a variadic function type">;
+def warn_deprecated_missing_comma_before_ellipsis : Warning<
+ "declaration of a variadic function without a comma before '...' is deprecated">,
+ InGroup<DeprecatedMissingCommaVariadicParam>;
def err_unexpected_typedef_ident : Error<
"unexpected type name %0: expected identifier">;
def warn_cxx98_compat_decltype : Warning<
diff --git a/clang/lib/Parse/ParseDecl.cpp b/clang/lib/Parse/ParseDecl.cpp
index aa5c2d28d429ac..937a94b02458c6 100644
--- a/clang/lib/Parse/ParseDecl.cpp
+++ b/clang/lib/Parse/ParseDecl.cpp
@@ -8119,6 +8119,14 @@ void Parser::ParseParameterDeclarationClause(
}
if (TryConsumeToken(tok::ellipsis, EllipsisLoc)) {
+ if (getLangOpts().CPlusPlus26) {
+ // C++26 [dcl.dcl.fct]p3:
+ // A parameter-declaration-clause of the form
+ // parameter-list '...' is deprecated.
+ Diag(EllipsisLoc, diag::warn_deprecated_missing_comma_before_ellipsis)
+ << FixItHint::CreateInsertion(EllipsisLoc, ", ");
+ }
+
if (!getLangOpts().CPlusPlus) {
// We have ellipsis without a preceding ',', which is ill-formed
// in C. Complain and provide the fix.
diff --git a/clang/test/CXX/drs/cwg722.cpp b/clang/test/CXX/drs/cwg722.cpp
index e90d9af360d9d0..6e7d4569c55381 100644
--- a/clang/test/CXX/drs/cwg722.cpp
+++ b/clang/test/CXX/drs/cwg722.cpp
@@ -14,7 +14,7 @@ namespace std {
using nullptr_t = decltype(nullptr);
}
-void f(std::nullptr_t...);
+void f(std::nullptr_t, ...);
std::nullptr_t g();
void h() {
std::nullptr_t np;
diff --git a/clang/test/Parser/cxx2c-oxford-variadic-comma.cpp b/clang/test/Parser/cxx2c-oxford-variadic-comma.cpp
new file mode 100644
index 00000000000000..b8015b4815b2e2
--- /dev/null
+++ b/clang/test/Parser/cxx2c-oxford-variadic-comma.cpp
@@ -0,0 +1,54 @@
+// RUN: %clang_cc1 -std=c++2c -fsyntax-only -fblocks -verify %s
+
+void a(...);
+
+void b(auto...);
+void c(auto, ...);
+
+void d(auto......); // expected-warning {{declaration of a variadic function without a comma before '...' is deprecated}} \
+ // expected-warning {{'...' in this location creates a C-style varargs function}} \
+ // expected-note {{preceding '...' declares a function parameter pack}} \
+ // expected-note {{insert ',' before '...' to silence this warning}}
+void e(auto..., ...);
+
+void f(auto x...); // expected-warning {{declaration of a variadic function without a comma before '...' is deprecated}}
+void g(auto x, ...);
+
+void h(auto... x...); // expected-warning {{declaration of a variadic function without a comma before '...' is deprecated}} \
+ // expected-warning {{'...' in this location creates a C-style varargs function}} \
+ // expected-note {{preceding '...' declares a function parameter pack}} \
+ // expected-note {{insert ',' before '...' to silence this warning}}
+void i(auto... x, ...);
+
+template<class ...Ts>
+void j(Ts... t...) {}; // expected-warning {{declaration of a variadic function without a comma before '...' is deprecated}} \
+ // expected-warning {{'...' in this location creates a C-style varargs function}} \
+ // expected-note {{preceding '...' declares a function parameter pack}} \
+ // expected-note {{insert ',' before '...' to silence this warning}}
+template<class ...Ts>
+void k(Ts... t, ...) {}
+
+void l(int...); // expected-warning {{declaration of a variadic function without a comma before '...' is deprecated}}
+void m(int, ...);
+
+void n(int x...); // expected-warning {{declaration of a variadic function without a comma before '...' is deprecated}}
+void o(int x, ...);
+
+struct S {
+ void p(this S...) {} // expected-warning {{declaration of a variadic function without a comma before '...' is deprecated}}
+};
+
+template<class ...Ts>
+void q(Ts......) {} // expected-warning {{declaration of a variadic function without a comma before '...' is deprecated}} \
+ // expected-warning {{'...' in this location creates a C-style varargs function}} \
+ // expected-note {{preceding '...' declares a function parameter pack}} \
+ // expected-note {{insert ',' before '...' to silence this warning}}
+
+template<class T>
+void r(T...) {} // expected-warning {{declaration of a variadic function without a comma before '...' is deprecated}}
+
+auto type_specifier = (void (*)(int...)) nullptr; // expected-warning {{declaration of a variadic function without a comma before '...' is deprecated}}
+
+auto lambda = [](int...) {}; // expected-warning {{declaration of a variadic function without a comma before '...' is deprecated}}
+
+auto block = ^(int...){}; // expected-warning {{declaration of a variadic function without a comma before '...' is deprecated}}
diff --git a/clang/www/cxx_status.html b/clang/www/cxx_status.html
index da01cf6ceab59b..fdb9807b1168c7 100755
--- a/clang/www/cxx_status.html
+++ b/clang/www/cxx_status.html
@@ -249,7 +249,7 @@ <h2 id="cxx26">C++2c implementation status</h2>
<tr>
<td>The Oxford variadic comma</td>
<td><a href="https://wg21.link/P3176R1">P3176R1</a></td>
- <td class="none" align="center">No</td>
+ <td class="unreleased" align="center">Clang 20</td>
</tr>
</table>
</details>
More information about the cfe-commits
mailing list