[clang] [clang] Implement P3176R1: The Oxford variadic comma (PR #117524)

Aaron Ballman via cfe-commits cfe-commits at lists.llvm.org
Wed Nov 27 07:11:30 PST 2024


================
@@ -0,0 +1,49 @@
+// RUN: %clang_cc1 -std=c++2c -fsyntax-only -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}}
----------------
AaronBallman wrote:

Other test cases:
```
// Testing that a type specifier is also diagnosed
auto a = (void (*)(int...))nullptr;

// Testing that a lambda parameter list is also diagnosed
(void)[](int...){};

// Testing that a block parameter list is also diagnosed
(void)^(int...){};
```

https://github.com/llvm/llvm-project/pull/117524


More information about the cfe-commits mailing list