blob: 5cf66b48784e917cdf6109cb3a80b0f0483e8021 [file] [log] [blame]
// 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}}
}
};
}