blob: e4b6156235ecc0b1282dca4a46ebb39116d6f510 [file] [log] [blame]
// RUN: %clang_cc1 -std=c++20 -triple x86_64-unknown-unknown %s -verify
namespace dr2621 { // dr2621: yes
enum class E { a };
namespace One {
using E_t = E;
using enum E_t; // typedef ok
auto v = a;
}
namespace Two {
using dr2621::E;
int E; // we see this
using enum E; // expected-error {{unknown type name E}}
}
}
namespace dr2628 { // dr2628: no open
// this was reverted for the 16.x release
// due to regressions, see the issue for more details:
// https://github.com/llvm/llvm-project/issues/60777
template <bool A = false, bool B = false>
struct foo {
// The expected notes below should be removed when dr2628 is fully implemented again
constexpr foo() requires (!A && !B) = delete; // expected-note {{candidate function [with A = false, B = false]}} #DR2628_CTOR
constexpr foo() requires (A || B) = delete; // expected-note {{candidate function [with A = false, B = false]}}
};
void f() {
// The FIXME's below should be the expected errors when dr2628 is
// fully implemented again.
// FIXME-expected-error {{call to deleted}}
foo fooable; // expected-error {{ambiguous deduction for template arguments of 'foo'}}
// FIXME-expected-note@#DR2628_CTOR {{marked deleted here}}
}
}
namespace dr2631 { // dr2631: 16
constexpr int g();
consteval int f() {
return g();
}
int k(int x = f()) {
return x;
}
constexpr int g() {
return 42;
}
int test() {
return k();
}
}
namespace dr2635 { // dr2635: 16
template<typename T>
concept UnaryC = true;
template<typename T, typename U>
concept BinaryC = true;
struct S{ int i, j; };
S get_S();
template<typename T>
T get_T();
void use() {
// expected-error@+1{{decomposition declaration cannot be declared with constrained 'auto'}}
UnaryC auto [a, b] = get_S();
// expected-error@+1{{decomposition declaration cannot be declared with constrained 'auto'}}
BinaryC<int> auto [c, d] = get_S();
}
template<typename T>
void TemplUse() {
// expected-error@+1{{decomposition declaration cannot be declared with constrained 'auto'}}
UnaryC auto [a, b] = get_T<T>();
// expected-error@+1{{decomposition declaration cannot be declared with constrained 'auto'}}
BinaryC<T> auto [c, d] = get_T<T>();
}
}
// dr2636: na
namespace dr2640 { // dr2640: 16
int \N{Λ} = 0; //expected-error {{'Λ' is not a valid Unicode character name}} \
//expected-error {{expected unqualified-id}}
const char* emoji = "\N{🤡}"; // expected-error {{'🤡' is not a valid Unicode character name}} \
// expected-note 5{{did you mean}}
#define z(x) 0
#define dr2640_a z(
int x = dr2640_a\N{abc}); // expected-error {{'abc' is not a valid Unicode character name}}
int y = dr2640_a\N{LOTUS}); // expected-error {{character <U+1FAB7> not allowed in an identifier}} \
// expected-error {{use of undeclared identifier 'dr2640_a🪷'}} \
// expected-error {{extraneous ')' before ';'}}
}
// dr2642: na
namespace dr2644 { // dr2644: yes
auto z = [a = 42](int a) { // expected-error {{a lambda parameter cannot shadow an explicitly captured entity}} \
// expected-note {{variable 'a' is explicitly captured here}}
return 1;
};
}
namespace dr2650 { // dr2650: yes
template <class T, T> struct S {};
template <class T> int f(S<T, T{}>*); // expected-note {{type 'X' of non-type template parameter is not a structural type}}
class X {
int m;
};
int i0 = f<X>(0); //expected-error {{no matching function for call to 'f'}}
}
namespace dr2654 { // dr2654: 16
void f() {
int neck, tail;
volatile int brachiosaur;
brachiosaur += neck; // OK
brachiosaur -= neck; // OK
brachiosaur |= neck; // OK
}
}
namespace dr2681 { // dr2681: 17
using size_t = decltype(sizeof(int));
template<class T, size_t N>
struct H {
T array[N];
};
template<class T, size_t N>
struct I {
volatile T array[N];
};
template<size_t N>
struct J { // expected-note 3{{candidate}}
unsigned char array[N];
};
H h = { "abc" };
I i = { "def" };
static_assert(__is_same(decltype(h), H<char, 4>)); // Not H<const char, 4>
static_assert(__is_same(decltype(i), I<char, 4>));
J j = { "ghi" }; // expected-error {{no viable constructor or deduction guide}}
}