// RUN: %clang_cc1 -std=c++98 %s -verify=expected -fexceptions -fcxx-exceptions -pedantic-errors // RUN: %clang_cc1 -std=c++11 %s -verify=expected,since-cxx11 -fexceptions -fcxx-exceptions -pedantic-errors // RUN: %clang_cc1 -std=c++14 %s -verify=expected,since-cxx11 -fexceptions -fcxx-exceptions -pedantic-errors // RUN: %clang_cc1 -std=c++17 %s -verify=expected,since-cxx11 -fexceptions -fcxx-exceptions -pedantic-errors // RUN: %clang_cc1 -std=c++20 %s -verify=expected,since-cxx11 -fexceptions -fcxx-exceptions -pedantic-errors // RUN: %clang_cc1 -std=c++23 %s -verify=expected,since-cxx11 -fexceptions -fcxx-exceptions -pedantic-errors // RUN: %clang_cc1 -std=c++2c %s -verify=expected,since-cxx11 -fexceptions -fcxx-exceptions -pedantic-errors namespace std { __extension__ typedef __SIZE_TYPE__ size_t; template struct initializer_list { const T *p; size_t n; initializer_list(const T *p, size_t n); }; } // namespace std namespace cwg930 { // cwg930: 2.7 #if __cplusplus >= 201103L static_assert(alignof(int[]) == alignof(int), ""); static_assert(alignof(int[][2]) == alignof(int[2]), ""); #endif } // namespace cwg930 namespace cwg948 { // cwg948: 3.7 #if __cplusplus >= 201103L class A { public: constexpr A(int v) : v(v) { } constexpr operator int() const { return v; } private: int v; }; constexpr int id(int x) { return x; } void f() { if (constexpr int i = id(101)) { } switch (constexpr int i = id(2)) { default: break; case 2: break; } for (; constexpr int i = id(0); ) { } while (constexpr int i = id(0)) { } if (constexpr A i = 101) { } switch (constexpr A i = 2) { default: break; case 2: break; } for (; constexpr A i = 0; ) { } while (constexpr A i = 0) { } } #endif } // namespace cwg948 namespace cwg952 { // cwg952: 2.8 namespace example1 { struct A { typedef int I; // #cwg952-I }; struct B : private A { // #cwg952-B }; struct C : B { void f() { I i1; // expected-error@-1 {{'I' is a private member of 'cwg952::example1::A'}} // expected-note@#cwg952-B {{constrained by private inheritance here}} // expected-note@#cwg952-I {{member is declared here}} } I i2; // expected-error@-1 {{'I' is a private member of 'cwg952::example1::A'}} // expected-note@#cwg952-B {{constrained by private inheritance here}} // expected-note@#cwg952-I {{member is declared here}} struct D { I i3; // expected-error@-1 {{'I' is a private member of 'cwg952::example1::A'}} // expected-note@#cwg952-B {{constrained by private inheritance here}} // expected-note@#cwg952-I {{member is declared here}} void g() { I i4; // expected-error@-1 {{'I' is a private member of 'cwg952::example1::A'}} // expected-note@#cwg952-B {{constrained by private inheritance here}} // expected-note@#cwg952-I {{member is declared here}} } }; }; } // namespace example1 namespace example2 { struct A { protected: static int x; }; struct B : A { friend int get(B) { return x; } }; } // namespace example2 } // namespace cwg952 namespace cwg960 { // cwg960: 3.0 struct a {}; class A { #if __cplusplus >= 201103L // Check lvalue ref vs rvalue ref vs pointer. virtual a& rvalue_ref(); virtual a&& lvalue_ref(); virtual a& rvalue_vs_lvalue_ref(); // #cwg960-A-rvalue_vs_lvalue_ref virtual a&& lvalue_vs_rvalue_ref(); // #cwg960-A-lvalue_vs_rvalue_ref virtual a& rvalue_ref_vs_pointer(); // #cwg960-A-rvalue_ref_vs_pointer virtual a* pointer_vs_rvalue_ref(); // #cwg960-A-pointer_vs_rvalue_ref virtual a&& lvalue_ref_vs_pointer(); // #cwg960-A-lvalue_ref_vs_pointer virtual a* pointer_vs_lvalue_ref(); // #cwg960-A-pointer_vs_lvalue_ref #endif }; class B : A { #if __cplusplus >= 201103L // Check lvalue ref vs rvalue ref vs pointer. a& rvalue_ref() override; a&& lvalue_ref() override; a&& rvalue_vs_lvalue_ref() override; // since-cxx11-error@-1 {{virtual function 'rvalue_vs_lvalue_ref' has a different return type ('a &&') than the function it overrides (which has return type 'a &')}} // since-cxx11-note@#cwg960-A-rvalue_vs_lvalue_ref {{overridden virtual function is here}} a& lvalue_vs_rvalue_ref() override; // since-cxx11-error@-1 {{virtual function 'lvalue_vs_rvalue_ref' has a different return type ('a &') than the function it overrides (which has return type 'a &&')}} // since-cxx11-note@#cwg960-A-lvalue_vs_rvalue_ref {{overridden virtual function is here}} a* rvalue_ref_vs_pointer() override; // since-cxx11-error@-1 {{virtual function 'rvalue_ref_vs_pointer' has a different return type ('a *') than the function it overrides (which has return type 'a &')}} // since-cxx11-note@#cwg960-A-rvalue_ref_vs_pointer {{overridden virtual function is here}} a& pointer_vs_rvalue_ref() override; // since-cxx11-error@-1 {{virtual function 'pointer_vs_rvalue_ref' has a different return type ('a &') than the function it overrides (which has return type 'a *')}} // since-cxx11-note@#cwg960-A-pointer_vs_rvalue_ref {{overridden virtual function is here}} a* lvalue_ref_vs_pointer() override; // since-cxx11-error@-1 {{virtual function 'lvalue_ref_vs_pointer' has a different return type ('a *') than the function it overrides (which has return type 'a &&')}} // since-cxx11-note@#cwg960-A-lvalue_ref_vs_pointer {{overridden virtual function is here}} a&& pointer_vs_lvalue_ref() override; // since-cxx11-error@-1 {{virtual function 'pointer_vs_lvalue_ref' has a different return type ('a &&') than the function it overrides (which has return type 'a *')}} // since-cxx11-note@#cwg960-A-pointer_vs_lvalue_ref {{overridden virtual function is here}} #endif }; } // namespace cwg960 namespace cwg974 { // cwg974: 3.3 #if __cplusplus >= 201103L void test() { auto lam = [](int x = 42) { return x; }; } #endif } // namespace cwg974 namespace cwg977 { // cwg977: 2.7 enum E { e = E() }; // #cwg977-E #if !defined(_WIN32) || defined(__MINGW32__) // expected-error@#cwg977-E {{invalid use of incomplete type 'E'}} // expected-note@#cwg977-E {{definition of 'cwg977::E' is not complete until the closing '}'}} #endif #if __cplusplus >= 201103L enum E2 : int { e2 = E2() }; enum struct E3 { e = static_cast(E3()) }; enum struct E4 : int { e = static_cast(E4()) }; #endif } // namespace cwg977 namespace cwg990 { // cwg990: 3.5 #if __cplusplus >= 201103L struct A { // #cwg990-A A(std::initializer_list); // #cwg990-A-init-list }; struct B { A a; }; B b1 { }; B b2 { 1 }; // since-cxx11-error@-1 {{no viable conversion from 'int' to 'A'}} // since-cxx11-note@#cwg990-A {{candidate constructor (the implicit copy constructor) not viable: no known conversion from 'int' to 'const A &' for 1st argument}} // since-cxx11-note@#cwg990-A {{candidate constructor (the implicit move constructor) not viable: no known conversion from 'int' to 'A &&' for 1st argument}} // since-cxx11-note@#cwg990-A-init-list {{candidate constructor not viable: no known conversion from 'int' to 'std::initializer_list' for 1st argument}} B b3 { { 1 } }; struct C { C(); C(int); C(std::initializer_list) = delete; // #cwg990-deleted }; C c1[3] { 1 }; // ok C c2[3] { 1, {2} }; // since-cxx11-error@-1 {{call to deleted constructor of 'C'}} // since-cxx11-note@#cwg990-deleted {{'C' has been explicitly marked deleted here}} struct D { D(); D(std::initializer_list); D(std::initializer_list); }; D d{}; #endif } // namespace cwg990