| // RUN: %clang -cc1 -fsyntax-only -verify -std=c++2c -Wunused-parameter -Wunused -Wpre-c++26-compat %s |
| |
| void static_var() { |
| static int _; // expected-note {{previous definition is here}} \ |
| // expected-note {{candidate}} |
| static int _; // expected-error {{redefinition of '_'}} |
| int _; // expected-warning {{placeholder variables are incompatible with C++ standards before C++2c}} \ |
| // expected-note {{candidate}} |
| _++; // expected-error{{reference to '_' is ambiguous}} |
| } |
| |
| void static_var_2() { |
| int _; // expected-note {{previous definition is here}} |
| static int _; // expected-error {{redefinition of '_'}} |
| } |
| |
| void bindings() { |
| int arr[4] = {0, 1, 2, 3}; |
| auto [_, _, _, _] = arr; // expected-warning 3{{placeholder variables are incompatible with C++ standards before C++2c}} \ |
| // expected-note 4{{placeholder declared here}} |
| _ == 42; // expected-error {{ambiguous reference to placeholder '_', which is defined multiple times}} |
| { |
| // no extension warning as we only introduce a single placeholder. |
| auto [_, a, b, c] = arr; // expected-warning {{unused variable '[_, a, b, c]'}} |
| } |
| { |
| auto [_, _, b, c] = arr; // expected-warning {{unused variable '[_, _, b, c]'}} \ |
| // expected-warning {{placeholder variables are incompatible with C++ standards before C++2c}} |
| } |
| { |
| // There are only 3 extension warnings because the first |
| // introduction of `_` is valid in all C++ standards |
| auto [_, _, _, _] = arr; // expected-warning 3{{placeholder variables are incompatible with C++ standards before C++2c}} |
| } |
| } |
| |
| namespace StaticBindings { |
| |
| int arr[2] = {0, 1}; |
| static auto [_, _] = arr; // expected-error {{redefinition of '_'}} \ |
| // expected-note {{previous definition is here}} |
| |
| void f() { |
| int arr[2] = {0, 1}; |
| static auto [_, _] = arr; // expected-error {{redefinition of '_'}} \ |
| // expected-note {{previous definition is here}} |
| } |
| |
| } |
| |
| void lambda() { |
| (void)[_ = 0, _ = 1] { // expected-warning {{placeholder variables are incompatible with C++ standards before C++2c}} \ |
| // expected-note 4{{placeholder declared here}} |
| (void)_++; // expected-error {{ambiguous reference to placeholder '_', which is defined multiple times}} |
| }; |
| |
| { |
| int _ = 12; |
| (void)[_ = 0]{}; // no warning (different scope) |
| } |
| } |
| |
| namespace global_var { |
| int _; // expected-note {{previous definition is here}} |
| int _; // expected-error {{redefinition of '_'}} |
| } |
| |
| namespace { |
| int _; // expected-note {{previous definition is here}} |
| int _; // expected-error {{redefinition of '_'}} |
| } |
| |
| |
| namespace global_fun { |
| void _(); |
| void _(); |
| |
| void _() {} // expected-note {{previous definition is here}} |
| void _() {} // expected-error {{redefinition of '_'}} |
| void _(int){} |
| } |
| |
| typedef int _; |
| typedef int _; // Type redeclaration, nothing to do with placeholders |
| |
| void extern_test() { |
| extern int _; |
| extern int _; // expected-note {{candidate}} |
| int _; //expected-note {{candidate}} |
| _++; // expected-error {{reference to '_' is ambiguous}} |
| } |
| |
| |
| struct Members { |
| int _; // expected-note 2{{placeholder declared here}} |
| int _; // expected-warning{{placeholder variables are incompatible with C++ standards before C++2c}} \ |
| // expected-note 2{{placeholder declared here}} |
| void f() { |
| _++; // expected-error {{ambiguous reference to placeholder '_', which is defined multiple times}} |
| } |
| void attributes() __attribute__((diagnose_if(_ != 0, "oh no!", "warning"))); // expected-error{{ambiguous reference to placeholder '_', which is defined multiple times}} |
| }; |
| |
| namespace using_ { |
| int _; // expected-note {{target of using declaration}} |
| void f() { |
| int _; // expected-note {{conflicting declaration}} |
| _ = 0; |
| using using_::_; // expected-error {{target of using declaration conflicts with declaration already in scope}} |
| } |
| } |
| |
| |
| void call(int); |
| void test_param(int _) {} |
| void test_params(int _, int _); // expected-error {{redefinition of parameter '_'}} \ |
| // expected-note {{previous declaration is here}} |
| |
| template <auto _, auto _> // expected-error {{declaration of '_' shadows template parameter}} \ |
| // expected-note {{template parameter is declared here}} |
| auto i = 0; |
| |
| template <typename T> |
| concept C = requires(T _, T _) { // expected-error {{redefinition of parameter '_'}} \ |
| // expected-note {{previous declaration is here}} |
| T{}; |
| }; |
| |
| struct S { |
| int a; |
| }; |
| |
| void f(S a, S _) { // expected-warning {{unused parameter 'a'}} |
| |
| } |
| |
| void unused_warning() { |
| int _ = 12; // placeholder variable, no unused-but-set warning |
| int x = 12; // expected-warning {{unused variable 'x'}} |
| int _ = 12; // expected-warning {{placeholder variables are incompatible with C++ standards before C++2c}} |
| } |
| |
| struct ShadowMembers { |
| int _; |
| void f() { |
| int _; |
| _ = 12; // Ok, access the local variable |
| (void)({ int _ = 12; _;}); // Ok, inside a different scope |
| } |
| }; |
| |
| struct MemberPtrs { |
| int _, _; // expected-warning {{placeholder variables are incompatible with C++ standards before C++2c}} \ |
| // expected-note 4{{placeholder declared here}} |
| }; |
| constexpr int oh_no = __builtin_offsetof(MemberPtrs, _); // expected-error {{ambiguous reference to placeholder '_', which is defined multiple times}} |
| int MemberPtrs::* ref = &MemberPtrs::_; // expected-error{{ambiguous reference to placeholder '_', which is defined multiple times}} |
| |
| |
| struct MemberInitializer { |
| MemberInitializer() : _(0) {} // expected-error {{ambiguous reference to placeholder '_', which is defined multiple times}} |
| int _, _; // expected-note 2{{placeholder declared here}} \ |
| // expected-warning {{placeholder variables are incompatible with C++ standards before C++2c}} |
| }; |
| |
| struct MemberAndUnion { |
| int _; // expected-note {{placeholder declared here}} |
| union { int _; int _; }; // expected-note 2 {{placeholder declared here}} \ |
| // expected-warning 2{{placeholder variables are incompatible with C++ standards before C++2c}} |
| |
| |
| MemberAndUnion() : _(0) {} // expected-error {{ambiguous reference to placeholder '_', which is defined multiple time}} |
| }; |
| |
| struct Union { union { int _, _, _; }; }; // expected-note 3{{placeholder declared here}} \ |
| // expected-warning 2{{placeholder variables are incompatible with C++ standards before C++2c}} |
| |
| void TestUnion() { |
| Union c; |
| c._ = 0; // expected-error {{ambiguous reference to placeholder '_', which is defined multiple times}} |
| } |
| |
| void AnonymousLocals() { |
| union {int _, _;}; // expected-warning {{placeholder variables are incompatible with C++ standards before C++2c}} \ |
| // expected-note 2{{placeholder declared here}} |
| union {int _, _;}; // expected-warning 2{{placeholder variables are incompatible with C++ standards before C++2c}} \ |
| // expected-note 2{{placeholder declared here}} |
| _. = 0; // expected-error {{ambiguous reference to placeholder '_', which is defined multiple times}} |
| } |
| |
| namespace StaticUnions { |
| |
| static union { int _ = 42; }; // expected-note {{previous declaration is here}} |
| static union { int _ = 43; }; // expected-error {{member of anonymous union redeclares '_'}} |
| |
| inline void StaticUnion() { |
| static union { int _{}; }; // expected-note {{previous declaration is here}} |
| static union { int _{}; }; // expected-error {{member of anonymous union redeclares '_'}} |
| } |
| |
| } |
| |
| namespace TagVariables { |
| |
| [[maybe_unused]] struct { |
| int _, _, _; // expected-warning 2{{placeholder variables are incompatible with C++ standards before C++2c}} |
| } a; |
| |
| [[maybe_unused]] union { |
| int _, _, _; // expected-warning 2{{placeholder variables are incompatible with C++ standards before C++2c}} |
| } b; |
| |
| } |
| |
| namespace MemberLookupTests { |
| |
| struct S { |
| int _, _; // expected-warning {{placeholder variables are incompatible with C++ standards before C++2c}} \ |
| // expected-note 8{{placeholder declared here}} |
| |
| void f() { |
| _ ++ ; // expected-error {{ambiguous reference to placeholder '_', which is defined multiple times}} |
| } |
| }; |
| |
| struct T : S { |
| |
| }; |
| |
| void Test() { |
| S s{._ =0}; // expected-error {{ambiguous reference to placeholder '_', which is defined multiple times}} |
| S{}._; // expected-error {{ambiguous reference to placeholder '_', which is defined multiple times}} |
| T{}._; // expected-error {{ambiguous reference to placeholder '_', which is defined multiple times}} |
| }; |
| |
| }; |
| |
| namespace Bases { |
| struct S { |
| int _, _; // expected-warning {{placeholder variables are incompatible with C++ standards before C++2c}} \ |
| // expected-note 2{{placeholder declared here}} |
| int a; |
| }; |
| struct T : S{ |
| int _, _; // expected-warning {{placeholder variables are incompatible with C++ standards before C++2c}} \ |
| // expected-note 2{{placeholder declared here}} |
| int a; |
| void f() { |
| _; // expected-error {{ambiguous reference to placeholder '_', which is defined multiple times}} |
| S::_; // expected-error {{ambiguous reference to placeholder '_', which is defined multiple times}} \ |
| // expected-error {{a type specifier is required for all declarations}} |
| } |
| }; |
| } |