// RUN: %clang_cc1 -std=c++98 %s -verify=expected,cxx98 -fexceptions -fcxx-exceptions -pedantic-errors // RUN: %clang_cc1 -std=c++11 %s -verify=expected,cxx11-14,since-cxx11 -fexceptions -fcxx-exceptions -pedantic-errors // RUN: %clang_cc1 -std=c++14 %s -verify=expected,cxx11-14,since-cxx11,since-cxx14 -fexceptions -fcxx-exceptions -pedantic-errors // RUN: %clang_cc1 -std=c++17 %s -verify=expected,since-cxx11,since-cxx14,since-cxx17 -fexceptions -fcxx-exceptions -pedantic-errors // RUN: %clang_cc1 -std=c++20 %s -verify=expected,since-cxx11,since-cxx14,since-cxx17,since-cxx20 -fexceptions -fcxx-exceptions -pedantic-errors // RUN: %clang_cc1 -std=c++23 %s -verify=expected,since-cxx11,since-cxx14,since-cxx17,since-cxx20 -fexceptions -fcxx-exceptions -pedantic-errors // RUN: %clang_cc1 -std=c++2c %s -verify=expected,since-cxx11,since-cxx14,since-cxx17,since-cxx20 -fexceptions -fcxx-exceptions -pedantic-errors namespace std { __extension__ typedef __SIZE_TYPE__ size_t; template struct initializer_list { const E *p; size_t n; initializer_list(const E *p, size_t n); initializer_list(); }; } namespace cwg2303 { // cwg2303: 12 #if __cplusplus >= 201103L template struct A; template <> struct A<> {}; template struct A : A {}; struct B : A {}; struct C : A, A {}; /* since-cxx11-warning@-1 {{direct base 'A' is inaccessible due to ambiguity: struct cwg2303::C -> A -> A struct cwg2303::C -> A}} */ struct D : A, A {}; /* since-cxx11-warning@-1 {{direct base 'A' is inaccessible due to ambiguity: struct cwg2303::D -> A struct cwg2303::D -> A -> A}} */ struct E : A {}; struct F : B, E {}; template void f(const A &) { static_assert(sizeof...(T) == 2, "Should only match A"); } template void f2(const A *); void g() { f(B{}); // This is no longer ambiguous. B b; f2(&b); f(C{}); f(D{}); f(F{}); /* since-cxx11-error@-1 {{ambiguous conversion from derived class 'const F' to base class 'const A': struct cwg2303::F -> B -> A struct cwg2303::F -> E -> A}} */ } #endif } // namespace cwg2303 namespace cwg2304 { // cwg2304: 2.8 template void foo(T, int); template void foo(T&, ...); struct Q; // #cwg2304-Q void fn1(Q &data_vectors) { foo(data_vectors, 0); // expected-error@-1 {{argument type 'cwg2304::Q' is incomplete}} // expected-note@#cwg2304-Q {{forward declaration of 'cwg2304::Q'}} } } // namespace cwg2304 namespace cwg2310 { // cwg2310: partial #if __cplusplus >= 201103L template struct check_derived_from { static A a; // FIXME: all 3 examples should be rejected in all language modes. // FIXME: we should test this in 98 mode. // FIXME: we accept this when MSVC triple is used static constexpr B *p = &a; #if !defined(_WIN32) || defined(__MINGW32__) // cxx11-14-error@-2 {{cannot initialize a variable of type 'cwg2310::X *const' with an rvalue of type 'cwg2310::Z *'}} // cxx11-14-note@#cwg2310-X {{in instantiation of template class 'cwg2310::check_derived_from' requested here}} // cxx11-14-error@-4 {{cannot initialize a variable of type 'cwg2310::Y *const' with an rvalue of type 'cwg2310::Z *'}} // cxx11-14-note@#cwg2310-Y {{in instantiation of template class 'cwg2310::check_derived_from' requested here}} #endif }; struct W {}; struct X {}; struct Y {}; struct Z : W, X, check_derived_from, // #cwg2310-X check_derived_from, Y // #cwg2310-Y { // FIXME: It was properly rejected before, but we're crashing since Clang 11 in C++11 and C++14 modes. // See https://github.com/llvm/llvm-project/issues/59920 #if __cplusplus >= 201703L check_derived_from cdf; #endif }; #endif } // namespace cwg2310 // cwg2331: na // cwg2335 is in cwg2335.cxx namespace cwg2311 { // cwg2311 is open with no proposed resolution #if __cplusplus >= 201707L template void test() { // Ensure none of these try to call a move constructor. T a = T{T(0)}; T b{T(0)}; auto c{T(0)}; T d = {T(0)}; auto e = {T(0)}; #if __cplusplus >= 202302L auto f = auto{T(0)}; #endif void(*fn)(T); fn({T(0)}); } struct NonMovable { NonMovable(int); NonMovable(NonMovable&&) = delete; }; struct NonMovableNonApplicableIList { NonMovableNonApplicableIList(int); NonMovableNonApplicableIList(NonMovableNonApplicableIList&&) = delete; NonMovableNonApplicableIList(std::initializer_list); }; struct ExplicitMovable { ExplicitMovable(int); explicit ExplicitMovable(ExplicitMovable&&); }; struct ExplicitNonMovable { ExplicitNonMovable(int); explicit ExplicitNonMovable(ExplicitNonMovable&&) = delete; }; struct ExplicitNonMovableNonApplicableIList { ExplicitNonMovableNonApplicableIList(int); explicit ExplicitNonMovableNonApplicableIList(ExplicitNonMovableNonApplicableIList&&) = delete; ExplicitNonMovableNonApplicableIList(std::initializer_list); }; struct CopyOnly { CopyOnly(int); CopyOnly(const CopyOnly&); CopyOnly(CopyOnly&&) = delete; }; struct ExplicitCopyOnly { ExplicitCopyOnly(int); explicit ExplicitCopyOnly(const ExplicitCopyOnly&); explicit ExplicitCopyOnly(ExplicitCopyOnly&&) = delete; }; template void test(); template void test(); template void test(); template void test(); template void test(); template void test(); template void test(); struct any { template any(T&&); }; template struct X { X(); X(T) = delete; // #cwg2311-X }; X> x{ X>() }; // since-cxx17-error@-1 {{call to deleted constructor of 'X>'}} // since-cxx17-note@#cwg2311-X {{'X' has been explicitly marked deleted here}} // Per the currently implemented resolution, this does not apply to std::initializer_list. // An initializer list initialized from `{ e }` always has exactly one element constructed // from `e`, where previously that could have been a copy of an init list or `e.operator std::initializer_list()` struct InitListCtor { InitListCtor(int); InitListCtor(InitListCtor&&) = delete; InitListCtor(std::initializer_list) = delete; // #cwg2311-InitListCtor }; std::initializer_list i; auto j = std::initializer_list{ i }; // since-cxx17-error@-1 {{conversion function from 'std::initializer_list' to 'const InitListCtor' invokes a deleted function}} // since-cxx17-note@#cwg2311-InitListCtor {{'InitListCtor' has been explicitly marked deleted here}} #endif } // namespace cwg2311 namespace cwg2338 { // cwg2338: 12 #if __cplusplus >= 201103L namespace B { enum E : bool { Zero, One }; static_assert((int)(E)2 == 1, ""); } // namespace B namespace D { enum class E : bool { Zero, One }; static_assert((int)(E)2 == 1, ""); } // namespace D #endif } // namespace cwg2338 namespace cwg2346 { // cwg2346: 11 void test() { const int i2 = 0; extern void h2b(int x = i2 + 0); // ok, not odr-use } } // namespace cwg2346 namespace cwg2351 { // cwg2351: 20 #if __cplusplus >= 201103L static_assert((void{}, true), ""); void f() { return void{}; } template void g() { return T{}; } template void g(); template void g(); void h() { return {}; // since-cxx11-error@-1 {{void function 'h' must not return a value}} } template T i() { return T{I...}; } template void i(); template const void i(); static_assert((void({}), true), ""); // since-cxx11-error@-1 {{cannot initialize non-class type 'void' with a parenthesized initializer list}} #else int I = (void{}, 0); // cxx98-error@-1 {{expected ')'}} // cxx98-note@-2 {{to match this '('}} // cxx98-error@-3 {{expected expression}} #endif } // namespace cwg2351 namespace cwg2352 { // cwg2352: 10 int **p; const int *const *const &f1() { return p; } int *const *const &f2() { return p; } int **const &f3() { return p; } const int **const &f4() { return p; } // expected-error@-1 {{reference to type 'const int **const' could not bind to an lvalue of type 'int **'}} const int *const *&f5() { return p; } // expected-error@-1 {{binding reference of type 'const int *const *' to value of type 'int **' not permitted due to incompatible qualifiers}} // FIXME: We permit this as a speculative defect resolution, allowing // qualification conversions when forming a glvalue conditional expression. const int * const * const q = 0; __typeof(&(true ? p : q)) x = &(true ? p : q); // FIXME: Should we compute the composite pointer type here and produce an // lvalue of type 'const int *const * const'? const int * const * r; void *y = &(true ? p : r); // expected-error@-1 {{rvalue of type 'const int *const *'}} // FIXME: We order these as a speculative defect resolution. void f(const int * const * const &r); #if __cplusplus >= 201103L constexpr #endif int *const *const &f(int * const * const &r) { return r; } // No temporary is created here. int *const *const &check_f = f(p); #if __cplusplus >= 201103L static_assert(&p == &check_f, ""); #endif } // namespace cwg2352 namespace cwg2354 { // cwg2354: 15 #if __cplusplus >= 201103L enum alignas(64) A {}; // since-cxx11-error@-1 {{'alignas' attribute cannot be applied to an enumeration}} enum struct alignas(64) B {}; // since-cxx11-error@-1 {{'alignas' attribute cannot be applied to an enumeration}} #endif } // namespace cwg2354 namespace cwg2356 { // cwg2356: 4 #if __cplusplus >= 201103L struct A { A(); A(A &&); // #1 template A(T &&); // #2 }; struct B : A { using A::A; B(const B &); // #3 B(B &&) = default; // #4, implicitly deleted // since-cxx11-warning@-1 {{explicitly defaulted move constructor is implicitly deleted}} // since-cxx11-note@#cwg2356-X {{move constructor of 'B' is implicitly deleted because field 'x' has a deleted move constructor}} // since-cxx11-note@#cwg2356-X {{'X' has been explicitly marked deleted here}} // since-cxx11-note@-4 {{replace 'default' with 'delete'}} struct X { X(X &&) = delete; } x; // #cwg2356-X }; extern B b1; B b2 = static_cast(b1); // calls #3: #1, #2, and #4 are not viable struct C { operator B&&(); }; B b3 = C(); // calls #3 #endif } // namespace cwg2356 namespace cwg2358 { // cwg2358: 16 #if __cplusplus >= 201402L void f2() { int i = 1; void g1(int = [xxx=1] { return xxx; }()); // OK void g2(int = [xxx=i] { return xxx; }()); // since-cxx14-error@-1 {{default argument references local variable 'i' of enclosing function}} } #endif } // namespace cwg2358 // CWG2363 was closed as NAD, but its resolution does affirm that // a friend declaration cannot have an opaque-enumm-specifier. namespace cwg2363 { // cwg2363: 19 #if __cplusplus >= 201103L enum class E0; enum E1 : int; struct A { friend enum class E0; // since-cxx11-error@-1 {{reference to enumeration must use 'enum' not 'enum class'}} // since-cxx11-error@-2 {{elaborated enum specifier cannot be declared as a friend}} // since-cxx11-note@-3 {{remove 'enum class' to befriend an enum}} friend enum E0; // since-cxx11-error@-1 {{elaborated enum specifier cannot be declared as a friend}} // since-cxx11-note@-2 {{remove 'enum' to befriend an enum}} friend enum class E1; // since-cxx11-error@-1 {{reference to enumeration must use 'enum' not 'enum class'}} // since-cxx11-error@-2 {{elaborated enum specifier cannot be declared as a friend}} // since-cxx11-note@-3 {{remove 'enum class' to befriend an enum}} friend enum E1; // since-cxx11-error@-1 {{elaborated enum specifier cannot be declared as a friend}} // since-cxx11-note@-2 {{remove 'enum' to befriend an enum}} friend enum class E2; // since-cxx11-error@-1 {{reference to enumeration must use 'enum' not 'enum class'}} // since-cxx11-error@-2 {{elaborated enum specifier cannot be declared as a friend}} // since-cxx11-note@-3 {{remove 'enum class' to befriend an enum}} }; #endif } // namespace cwg2363 namespace cwg2369 { // cwg2369: partial #if __cplusplus >= 202002L template struct Z { typedef typename T::x xx; }; template concept C = requires { typename T::A; }; template typename Z::xx f(void *, T); // #1 template void f(int, T); // #2 struct A { } a; struct ZZ { template ::xx> operator T *(); operator int(); }; void foo() { ZZ zz; f(1, a); // OK, deduction fails for #1 because there is no conversion from int // to void* f(zz, 42); // OK, deduction fails for #1 because C is not satisfied } #endif } // namespace cwg2369 namespace cwg2370 { // cwg2370: no namespace N { typedef int type; void g(type); void h(type); } // namespace N class C { typedef N::type N_type; // FIXME: `type` should be searched for in N // friend void N::g(type); friend void N::h(N_type); }; } // namespace cwg2370 namespace cwg2376 { // cwg2376: 21 #if __cplusplus >= 201703L template class C {}; C a; const volatile C b = C<2>(); C (c) = {}; C* d; // expected-error@-1 {{cannot form pointer to deduced class template specialization type}} C e[1]; // expected-error@-1 {{cannot form array of deduced class template specialization type}} #endif } namespace cwg2386 { // cwg2386: 9 // Otherwise, if the qualified-id std::tuple_size names a complete class // type **with a member value**, the expression std::tuple_size::value shall // be a well-formed integral constant expression #if __cplusplus >= 201702L struct Bad1 { int a, b; }; struct Bad2 { int a, b; }; } // namespace cwg2386 namespace std { template struct tuple_size; template <> struct tuple_size {}; template <> struct tuple_size { static const int value = 42; }; } // namespace std namespace cwg2386 { void no_value() { auto [x, y] = Bad1(); } void wrong_value() { auto [x, y] = Bad2(); } // since-cxx17-error@-1 {{type 'Bad2' binds to 42 elements, but only 2 names were provided}} #endif } // namespace cwg2386 // cwg2385: na namespace cwg2387 { // cwg2387: 9 #if __cplusplus >= 201402L template int a = 0; extern template int a<0>; // ok template static int b = 0; extern template int b<0>; // since-cxx14-error@-1 {{explicit instantiation declaration of 'b<0>' with internal linkage}} template const int c = 0; extern template const int c<0>; // ok, has external linkage despite 'const' template T d = 0; extern template int d; extern template const int d; #endif } // namespace cwg2387 namespace cwg2390 { // cwg2390: 14 // Test that macro expansion of the builtin argument works. #define C clang #define F fallthrough #define CF clang::fallthrough #if !__has_cpp_attribute(F) #error "doesn't have fallthrough" #endif #if !__has_cpp_attribute(C::F) #error "doesn't have clang::fallthrough 1" #endif #if !__has_cpp_attribute(clang::F) #error "doesn't have clang::fallthrough 2" #endif #if !__has_cpp_attribute(C::fallthrough) #error "doesn't have clang::fallthrough 3" #endif #if !__has_cpp_attribute(CF) #error "doesn't have clang::fallthrough 4" #endif #define FUNCLIKE1(x) clang::x #if !__has_cpp_attribute(FUNCLIKE1(fallthrough)) #error "doesn't have clang::fallthrough through func-like macro 1" #endif #define FUNCLIKE2(x) _Clang::x #if !__has_cpp_attribute(FUNCLIKE2(fallthrough)) #error "doesn't have clang::fallthrough through func-like macro 2" #endif } // namespace cwg2390 namespace cwg2394 { // cwg2394: 15 struct A {}; const A a; // Now allowed to default-init B. struct B { const A a; }; B b; } // namespace cwg2394 namespace cwg2396 { // cwg2396: no struct A { struct B; operator B B::*(); }; struct B; // FIXME: per P1787 "Calling a conversion function" example, all of the // examples below are well-formed, with B resolving to A::B, but currently // it's been resolved to cwg2396::B. // void f(A a) { a.operator B B::*(); } // void g(A a) { a.operator decltype(B()) B::*(); } // void g2(A a) { a.operator B decltype(B())::*(); } } // namespace cwg2396 namespace cwg2397 { // cwg2397: 17 #if __cplusplus >= 201103L void foo() { int a[5]; auto (&b)[5] = a; auto (*c)[5] = &a; } #endif } // namespace cwg2397