// RUN: env ASAN_OPTIONS=detect_stack_use_after_return=0 %clang_cc1 -std=c++98 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors // RUN: env ASAN_OPTIONS=detect_stack_use_after_return=0 %clang_cc1 -std=c++11 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors // RUN: env ASAN_OPTIONS=detect_stack_use_after_return=0 %clang_cc1 -std=c++14 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors // RUN: env ASAN_OPTIONS=detect_stack_use_after_return=0 %clang_cc1 -std=c++17 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors // FIXME: __SIZE_TYPE__ expands to 'long long' on some targets. __extension__ typedef __SIZE_TYPE__ size_t; namespace std { struct type_info; } namespace dr400 { // dr400: yes struct A { int a; struct a {}; }; // expected-note 2{{conflicting}} expected-note {{ambiguous}} struct B { int a; struct a {}; }; // expected-note 2{{target}} expected-note {{ambiguous}} struct C : A, B { using A::a; struct a b; }; struct D : A, B { using A::a; using B::a; struct a b; }; // expected-error 2{{conflicts}} struct E : A, B { struct a b; }; // expected-error {{found in multiple base classes}} } namespace dr401 { // dr401: yes template class A : public T {}; // expected-error {{protected}} expected-error 2{{private}} class B { protected: typedef int type; // expected-note {{protected}} #if __cplusplus == 199711L // expected-note@-2 {{protected}} #endif }; class C { typedef int type; // expected-note {{private}} friend class A; // expected-note {{default argument}} }; class D { typedef int type; // expected-note {{private}} friend class A; }; A *b; // expected-note {{default argument}} A *d; // expected-note {{in instantiation of default argument}} struct E { template class A : public T {}; }; class F { typedef int type; friend class E; }; E::A eaf; // ok, default argument is in befriended context // FIXME: Why do we get different diagnostics in C++11 onwards here? We seem // to not treat the default template argument as a SFINAE context in C++98. template void f(T) {} void g(B b) { f(b); } #if __cplusplus < 201103L // expected-error@-3 0-1{{extension}} expected-error@-3 {{protected}} expected-note@-3 {{instantiation}} // expected-note@-3 {{substituting}} #else // expected-error@-5 {{no matching}} expected-note@-6 {{protected}} #endif } namespace dr403 { // dr403: yes namespace A { struct S {}; int f(void*); } template struct X {}; typedef struct X::X XS; XS *p; int k = f(p); // ok, finds A::f, even though type XS is a typedef-name // referring to an elaborated-type-specifier naming a // injected-class-name, which is about as far from a // template-id as we can make it. } // dr404: na // (NB: also sup 594) namespace dr406 { // dr406: yes typedef struct { static int n; // expected-error {{static data member 'n' not allowed in anonymous struct}} } A; typedef union { static int n; // expected-error {{static data member 'n' not allowed in anonymous union}} } B; } namespace dr407 { // dr407: 3.8 struct S; typedef struct S S; void f() { struct S *p; { typedef struct S S; // expected-note {{here}} struct S *p; // expected-error {{typedef 'S' cannot be referenced with a struct specifier}} } } struct S {}; namespace UsingDir { namespace A { struct S {}; // expected-note {{found}} } namespace B { typedef int S; // expected-note {{found}} } namespace C { using namespace A; using namespace B; struct S s; // expected-error {{ambiguous}} } namespace D { using A::S; typedef struct S S; struct S s; } namespace E { // The standard doesn't say whether this is valid. We interpret // DR407 as meaning "if lookup finds both a tag and a typedef with the // same type, then it's OK in an elaborated-type-specifier". typedef A::S S; using A::S; struct S s; } namespace F { typedef A::S S; } // The standard doesn't say what to do in these cases either. namespace G { using namespace A; using namespace F; struct S s; } namespace H { using namespace F; using namespace A; struct S s; } } } namespace dr408 { // dr408: 3.4 template void g() { int arr[N != 1 ? 1 : -1]; } template<> void g<2>() { } template struct S { static int i[]; void f(); }; template int S::i[] = { 1 }; template void S::f() { g(); } template<> int S::i[] = { 1, 2 }; template void S::f(); // uses g<2>(), not g<1>(). template struct R { static int arr[]; void f(); }; template int R::arr[1]; template void R::f() { int arr[sizeof(arr) != sizeof(int) ? 1 : -1]; } template<> int R::arr[2]; template void R::f(); } namespace dr409 { // dr409: yes template struct A { typedef int B; B b1; A::B b2; A::B b3; A::B b4; // expected-error {{missing 'typename'}} }; } namespace dr410 { // dr410: no template void f(T); void g(int); namespace M { template void h(T); template void i(T); struct A { friend void f<>(int); friend void h<>(int); friend void g(int); template void i(T); friend void i<>(int); private: static void z(); // expected-note {{private}} }; template<> void h(int) { A::z(); } // FIXME: This should be ill-formed. The member A::i<> is befriended, // not this function. template<> void i(int) { A::z(); } } template<> void f(int) { M::A::z(); } void g(int) { M::A::z(); } // expected-error {{private}} } // dr412 is in its own file. namespace dr413 { // dr413: yes struct S { int a; int : 17; int b; }; S s = { 1, 2, 3 }; // expected-error {{excess elements}} struct E {}; struct T { // expected-note {{here}} int a; E e; int b; }; T t1 = { 1, {}, 2 }; T t2 = { 1, 2 }; // expected-error {{aggregate with no elements requires explicit braces}} } namespace dr414 { // dr414: dup 305 struct X {}; void f() { X x; struct X {}; x.~X(); } } namespace dr415 { // dr415: yes template void f(T, ...) { T::error; } void f(int, int); void g() { f(0, 0); } // ok } namespace dr416 { // dr416: yes extern struct A a; int &operator+(const A&, const A&); int &k = a + a; struct A { float &operator+(A&); }; float &f = a + a; } namespace dr417 { // dr417: no struct A; struct dr417::A {}; // expected-warning {{extra qualification}} struct B { struct X; }; struct C : B {}; struct C::X {}; // expected-error {{no struct named 'X' in 'dr417::C'}} struct B::X { struct Y; }; struct C::X::Y {}; // ok! namespace N { struct D; struct E; struct F; struct H; } // FIXME: This is ill-formed. using N::D; struct dr417::D {}; // expected-warning {{extra qualification}} using namespace N; struct dr417::E {}; // expected-warning {{extra qualification}} expected-error {{no struct named 'E'}} struct N::F {}; struct G; using N::H; namespace M { struct dr417::G {}; // expected-error {{namespace 'M' does not enclose}} struct dr417::H {}; // expected-error {{namespace 'M' does not enclose}} } } namespace dr420 { // dr420: yes template struct ptr { T *operator->() const; T &operator*() const; }; template void test(P p) { p->~T(); p->T::~T(); (*p).~T(); (*p).T::~T(); } struct X {}; template void test(int*); template void test(ptr); template void test(X*); template void test(ptr); template void test2(T p) { p->template Y::~Y(); p->~Y(); p->template ~Y(); // expected-error {{'template' keyword not permitted in destructor name}} } template struct Y {}; template void test2(Y*); template void test2(ptr >); void test3(int *p, ptr q) { typedef int Int; p->~Int(); q->~Int(); p->Int::~Int(); q->Int::~Int(); } #if __cplusplus >= 201103L template using id = T; struct A { template using id = T; }; void test4(int *p, ptr q) { p->~id(); q->~id(); p->id::~id(); q->id::~id(); p->template id::~id(); // OK since dr2292 q->template id::~id(); // OK since dr2292 p->A::template id::~id(); q->A::template id::~id(); } #endif } namespace dr421 { // dr421: yes struct X { X(); int n; int &r; }; int *p = &X().n; // expected-error-re {{{{taking the address of a temporary|cannot take the address of an rvalue}}}} int *q = &X().r; } namespace dr422 { // dr422: yes template void f() { typedef T type; // expected-note {{prev}} typedef U type; // expected-error {{redef}} } template void f(); template void f(); // expected-note {{instantiation}} } namespace dr423 { // dr423: yes template struct X { operator T&(); }; void f(X x) { x += 1; } } namespace dr424 { // dr424: yes struct A { typedef int N; // expected-note {{previous}} typedef int N; // expected-error {{redefinition}} struct X; typedef X X; // expected-note {{previous}} struct X {}; struct X *p; struct A::X *q; X *r; typedef X X; // expected-error {{redefinition}} }; struct B { typedef int N; }; struct C : B { typedef int N; // expected-note {{previous}} typedef int N; // expected-error {{redefinition}} }; } namespace dr425 { // dr425: yes struct A { template operator T() const; } a; float f = 1.0f * a; // expected-error {{ambiguous}} expected-note 5+{{built-in candidate}} template struct is_float; template<> struct is_float { typedef void type; }; struct B { template::type> operator T() const; // expected-error 0-1{{extension}} } b; float g = 1.0f * b; // ok } namespace dr427 { // dr427: yes struct B {}; struct D : public B { D(B &) = delete; // expected-error 0-1{{extension}} expected-note {{deleted}} }; extern D d1; B &b = d1; const D &d2 = static_cast(b); const D &d3 = (const D&)b; const D &d4(b); // expected-error {{deleted}} } namespace dr428 { // dr428: yes template T make(); extern struct X x; // expected-note 5{{forward declaration}} void f() { throw void(); // expected-error {{cannot throw}} throw make(); throw make(); throw x; // expected-error {{cannot throw}} throw make(); // expected-error {{cannot throw}} throw make(); // expected-error {{cannot throw}} throw make(); // expected-error {{cannot throw}} throw make(); // expected-error {{cannot throw}} } } namespace dr429 { // dr429: yes c++11 // FIXME: This rule is obviously intended to apply to C++98 as well. struct A { static void *operator new(size_t, size_t); static void operator delete(void*, size_t); } *a = new (0) A; #if __cplusplus >= 201103L // expected-error@-2 {{'new' expression with placement arguments refers to non-placement 'operator delete'}} // expected-note@-4 {{here}} #endif struct B { static void *operator new(size_t, size_t); static void operator delete(void*); static void operator delete(void*, size_t); } *b = new (0) B; // ok, second delete is not a non-placement deallocation function } namespace dr430 { // dr430: yes c++11 // resolved by n2239 // FIXME: This should apply in C++98 too. void f(int n) { int a[] = { n++, n++, n++ }; #if __cplusplus < 201103L // expected-warning@-2 {{multiple unsequenced modifications to 'n'}} #endif } } namespace dr431 { // dr431: yes struct A { template T *get(); template struct B { template U *get(); }; }; template void f(A a) { a.get()->get(); a.get() ->get(); // expected-error {{use 'template'}} a.get()->template get(); a.A::get(); A::B *b = a.get >(); b->get(); b->A::B::get(); b->A::B::get(); b->A::B::get(); // expected-error {{use 'template'}} b->A::B::template get(); b->A::B::get(); // expected-error {{use 'template'}} b->A::B::template get(); A::B *c = a.get >(); c->get(); // expected-error {{use 'template'}} c->template get(); } } namespace dr432 { // dr432: yes template struct A {}; template struct B : A {}; // expected-error {{requires template arguments}} expected-note {{declared}} template struct C : A > {}; #if __cplusplus >= 201103L template struct D : decltype(A()) {}; // expected-error {{requires template arguments}} expected-note {{declared}} #endif } namespace dr433 { // dr433: yes template struct S { void f(union U*); }; U *p; template void S::f(union U*) {} S s; } namespace dr434 { // dr434: sup 2352 void f() { const int ci = 0; int *pi = 0; const int *&rpci = pi; // expected-error {{incompatible qualifiers}} const int * const &rcpci = pi; // OK rpci = &ci; *pi = 1; } #if __cplusplus >= 201103L int *pi = 0; const int * const &rcpci = pi; static_assert(&rcpci == &pi, ""); #endif } // dr435: na namespace dr436 { // dr436: yes enum E { f }; // expected-note {{previous}} void f(); // expected-error {{redefinition}} } namespace dr437 { // dr437: sup 1308 // This is superseded by 1308, which is in turn superseded by 1330, // which restores this rule. template struct T : U {}; struct S { void f() throw(S); #if __cplusplus > 201402L // expected-error@-2 {{ISO C++17 does not allow}} expected-note@-2 {{use 'noexcept}} #endif void g() throw(T); #if __cplusplus > 201402L // expected-error@-2 {{ISO C++17 does not allow}} expected-note@-2 {{use 'noexcept}} #endif struct U; void h() throw(U); #if __cplusplus > 201402L // expected-error@-2 {{ISO C++17 does not allow}} expected-note@-2 {{use 'noexcept}} #endif struct U {}; }; } // dr438 FIXME write a codegen test // dr439 FIXME write a codegen test // dr441 FIXME write a codegen test // dr442: sup 348 // dr443: na namespace dr444 { // dr444: yes struct D; struct B { // expected-note {{candidate function (the implicit copy}} expected-note 0-1 {{implicit move}} D &operator=(D &) = delete; // expected-error 0-1{{extension}} expected-note {{deleted}} }; struct D : B { // expected-note {{candidate function (the implicit copy}} expected-note 0-1 {{implicit move}} using B::operator=; } extern d; void f() { d = d; // expected-error {{deleted}} } } namespace dr445 { // dr445: yes class A { void f(); }; // expected-note {{private}} struct B { friend void A::f(); // expected-error {{private}} }; } namespace dr446 { // dr446: yes struct C; struct A { A(); A(const A&) = delete; // expected-error 0-1{{extension}} expected-note +{{deleted}} A(const C&); }; struct C : A {}; void f(A a, bool b, C c) { void(b ? a : a); b ? A() : a; // expected-error {{deleted}} b ? a : A(); // expected-error {{deleted}} b ? A() : A(); #if __cplusplus <= 201402L // expected-error@-2 {{deleted}} #endif void(b ? a : c); b ? a : C(); // expected-error {{deleted}} b ? c : A(); #if __cplusplus <= 201402L // expected-error@-2 {{deleted}} #endif b ? A() : C(); #if __cplusplus <= 201402L // expected-error@-2 {{deleted}} #endif } } namespace dr447 { // dr447: yes struct A { int n; int a[4]; }; template struct U { typedef int type; template static void h(); }; template U g(T); template void f(int n) { // ok, not type dependent g(__builtin_offsetof(A, n)).h(); g(__builtin_offsetof(T, n)).h(); // value dependent if first argument is a dependent type U<__builtin_offsetof(A, n)>::type a; U<__builtin_offsetof(T, n)>::type b; // expected-error +{{}} expected-warning 0+{{}} // as an extension, we allow the member-designator to include array indices g(__builtin_offsetof(A, a[0])).h(); g(__builtin_offsetof(A, a[N])).h(); U<__builtin_offsetof(A, a[0])>::type c; U<__builtin_offsetof(A, a[N])>::type d; // expected-error +{{}} expected-warning 0+{{}} } } namespace dr448 { // dr448: yes template void f(int); // expected-error 0-1{{extension}} expected-note {{no known conversion}} template void g(T t) { f(t); // expected-error {{neither visible in the template definition nor found by argument-dependent lookup}} dr448::f(t); // expected-error {{no matching function}} } template void f(T); // expected-note {{should be declared prior to the call site}} namespace HideFromADL { struct X {}; } template void g(int); // ok template void g(HideFromADL::X); // expected-note {{instantiation of}} } // dr449: na namespace dr450 { // dr450: yes typedef int A[3]; void f1(const A &); void f2(A &); // expected-note +{{not viable}} struct S { A n; }; void g() { f1(S().n); f2(S().n); // expected-error {{no match}}} } #if __cplusplus >= 201103L void h() { f1(A{}); f2(A{}); // expected-error {{no match}} } #endif } namespace dr451 { // dr451: yes const int a = 1 / 0; // expected-warning {{undefined}} const int b = 1 / 0; // expected-warning {{undefined}} expected-note {{here}} expected-note 0-1{{division by zero}} int arr[b]; // expected-error +{{variable length arr}} expected-note {{initializer of 'b' is not a constant}} } namespace dr452 { // dr452: yes struct A { int a, b, c; A *p; int f(); A() : a(f()), b(this->f() + a), c(this->a), p(this) {} }; } // dr454 FIXME write a codegen test namespace dr456 { // dr456: yes // sup 903 c++11 const int null = 0; void *p = null; #if __cplusplus >= 201103L // expected-error@-2 {{cannot initialize}} #else // expected-warning@-4 {{null}} #endif const bool f = false; void *q = f; #if __cplusplus >= 201103L // expected-error@-2 {{cannot initialize}} #else // expected-warning@-4 {{null}} #endif } namespace dr457 { // dr457: yes const int a = 1; const volatile int b = 1; int ax[a]; int bx[b]; // expected-error +{{variable length array}} expected-note {{read of volatile}} enum E { ea = a, eb = b // expected-error {{constant}} expected-note {{read of volatile-qualified}} }; } namespace dr458 { // dr458: 11 struct A { int T; int f(); template int g(); }; template struct B : A { int f(); template int g(); template int h(); }; int A::f() { return T; } template // expected-note {{declared here}} int A::g() { return T; // expected-error {{'T' does not refer to a value}} } template int B::f() { return T; } template template int B::g() { return T; } template template // expected-note {{declared here}} int B::h() { return T; // expected-error {{'T' does not refer to a value}} } } namespace dr460 { // dr460: yes namespace X { namespace Q { int n; } } namespace Y { using X; // expected-error {{requires a qualified name}} using dr460::X; // expected-error {{cannot refer to a namespace}} using X::Q; // expected-error {{cannot refer to a namespace}} } } // dr461: na // dr462 FIXME write a codegen test // dr463: na // dr464: na // dr465: na namespace dr466 { // dr466: no typedef int I; typedef const int CI; typedef volatile int VI; void f(int *a, CI *b, VI *c) { a->~I(); a->~CI(); a->~VI(); a->I::~I(); a->CI::~CI(); a->VI::~VI(); a->CI::~VI(); // FIXME: This is invalid; CI and VI are not the same scalar type. b->~I(); b->~CI(); b->~VI(); b->I::~I(); b->CI::~CI(); b->VI::~VI(); c->~I(); c->~CI(); c->~VI(); c->I::~I(); c->CI::~CI(); c->VI::~VI(); } } namespace dr467 { // dr467: yes int stuff(); int f() { static bool done; if (done) goto later; static int k = stuff(); done = true; later: return k; } int g() { goto later; // expected-error {{cannot jump}} int k = stuff(); // expected-note {{bypasses variable initialization}} later: return k; } } namespace dr468 { // dr468: yes c++11 // FIXME: Should we allow this in C++98 too? template struct A { template struct B { static int C; }; }; int k = dr468::template A::template B::C; #if __cplusplus < 201103L // expected-error@-2 2{{'template' keyword outside of a template}} #endif } namespace dr469 { // dr469: no template struct X; // expected-note {{here}} template struct X {}; X x; // expected-error {{undefined}} } namespace dr470 { // dr470: yes template struct A { struct B {}; }; template struct C { }; template struct A; // expected-note {{previous}} template struct A::B; // expected-error {{duplicate explicit instantiation}} // ok, instantiating C doesn't instantiate base class members. template struct A; template struct C; } namespace dr471 { // dr471: yes struct A { int n; }; struct B : private virtual A {}; struct C : protected virtual A {}; struct D : B, C { int f() { return n; } }; struct E : private virtual A { using A::n; }; struct F : E, B { int f() { return n; } }; struct G : virtual A { private: using A::n; // expected-note {{here}} }; struct H : B, G { int f() { return n; } }; // expected-error {{private}} } namespace dr474 { // dr474: yes namespace N { struct S { void f(); }; } void N::S::f() { void g(); // expected-note {{previous}} } int g(); namespace N { int g(); // expected-error {{cannot be overloaded}} } } // dr475 FIXME write a codegen test namespace dr477 { // dr477: 3.5 struct A { explicit A(); virtual void f(); }; struct B { friend explicit A::A(); // expected-error {{'explicit' is invalid in friend declarations}} friend virtual void A::f(); // expected-error {{'virtual' is invalid in friend declarations}} }; explicit A::A() {} // expected-error {{can only be specified inside the class definition}} virtual void A::f() {} // expected-error {{can only be specified inside the class definition}} } namespace dr478 { // dr478: yes struct A { virtual void f() = 0; }; // expected-note {{unimplemented}} void f(A *a); void f(A a[10]); // expected-error {{array of abstract class type}} } namespace dr479 { // dr479: yes struct S { S(); private: S(const S&); // expected-note +{{here}} ~S(); // expected-note +{{here}} }; void f() { throw S(); // expected-error@-1 {{temporary of type 'dr479::S' has private destructor}} // expected-error@-2 {{exception object of type 'dr479::S' has private destructor}} #if __cplusplus < 201103L // expected-error@-4 {{C++98 requires an accessible copy constructor}} #endif #if __cplusplus <= 201402L // expected-error@-7 {{calling a private constructor}} (copy ctor) #endif } void g() { S s; // expected-error {{private destructor}}} throw s; // expected-error@-1 {{calling a private constructor}} // expected-error@-2 {{exception object of type 'dr479::S' has private destructor}} } void h() { try { f(); g(); } catch (S s) { // expected-error@-1 {{calling a private constructor}} // expected-error@-2 {{variable of type 'dr479::S' has private destructor}} } } } namespace dr480 { // dr480: yes struct A { int n; }; struct B : A {}; struct C : virtual B {}; struct D : C {}; int A::*a = &A::n; int D::*b = a; // expected-error {{virtual base}} extern int D::*c; int A::*d = static_cast(c); // expected-error {{virtual base}} D *e; A *f = e; D *g = static_cast(f); // expected-error {{virtual base}} extern D &i; A &j = i; D &k = static_cast(j); // expected-error {{virtual base}} } namespace dr481 { // dr481: yes template class A { T *x; }; T *x; // expected-error {{unknown type}} template class B { T *x; }; T *y; // ok struct C { template void f(class D *p); }; D *z; // ok template struct E { void f() { typedef ::dr481::C c; // expected-note {{previous}} typedef C c; // expected-error {{different type}} } }; template struct E<>; // ok template struct E; // expected-note {{instantiation of}} template class A, A *B, U_no_typo_correction *C> // expected-error {{unknown type}} struct F { U_no_typo_correction *x; // expected-error {{unknown type}} }; template class> struct G { H *x; }; H *q; typedef int N; template class T> struct I; template struct J; I<123, char*, J> *j; } namespace dr482 { // dr482: 3.5 extern int a; void f(); int dr482::a = 0; // expected-warning {{extra qualification}} void dr482::f() {} // expected-warning {{extra qualification}} inline namespace X { // expected-error 0-1{{C++11 feature}} extern int b; void g(); struct S; } int dr482::b = 0; // expected-warning {{extra qualification}} void dr482::g() {} // expected-warning {{extra qualification}} struct dr482::S {}; // expected-warning {{extra qualification}} void dr482::f(); // expected-warning {{extra qualification}} void dr482::g(); // expected-warning {{extra qualification}} // FIXME: The following are valid in DR482's wording, but these are bugs in // the wording which we deliberately don't implement. namespace N { typedef int type; } typedef int N::type; // expected-error {{typedef declarator cannot be qualified}} struct A { struct B; struct A::B {}; // expected-error {{extra qualification}} #if __cplusplus >= 201103L enum class C; enum class A::C {}; // expected-error {{extra qualification}} #endif }; } namespace dr483 { // dr483: yes namespace climits { int check1[__SCHAR_MAX__ >= 127 ? 1 : -1]; int check2[__SHRT_MAX__ >= 32767 ? 1 : -1]; int check3[__INT_MAX__ >= 32767 ? 1 : -1]; int check4[__LONG_MAX__ >= 2147483647 ? 1 : -1]; int check5[__LONG_LONG_MAX__ >= 9223372036854775807 ? 1 : -1]; #if __cplusplus < 201103L // expected-error@-2 {{extension}} #endif } namespace cstdint { int check1[__PTRDIFF_WIDTH__ >= 16 ? 1 : -1]; int check2[__SIG_ATOMIC_WIDTH__ >= 8 ? 1 : -1]; int check3[__SIZE_WIDTH__ >= 16 ? 1 : -1]; int check4[__WCHAR_WIDTH__ >= 8 ? 1 : -1]; int check5[__WINT_WIDTH__ >= 16 ? 1 : -1]; } } namespace dr484 { // dr484: yes struct A { A(); void f(); }; typedef const A CA; void CA::f() { this->~CA(); this->CA::~A(); this->CA::A::~A(); } CA::A() {} struct B : CA { B() : CA() {} void f() { return CA::f(); } }; struct C; typedef C CT; // expected-note {{here}} struct CT {}; // expected-error {{conflicts with typedef}} namespace N { struct D; typedef D DT; // expected-note {{here}} } struct N::DT {}; // expected-error {{conflicts with typedef}} typedef struct { S(); // expected-error {{requires a type}} } S; } namespace dr485 { // dr485: yes namespace N { struct S {}; int operator+(S, S); template int f(S); } template int f(); N::S s; int a = operator+(s, s); int b = f(s); } namespace dr486 { // dr486: yes template T f(T *); // expected-note 2{{substitution failure}} int &f(...); void g(); int n[10]; void h() { int &a = f(&g); int &b = f(&n); f(&g); // expected-error {{no match}} f(&n); // expected-error {{no match}} } } namespace dr487 { // dr487: yes enum E { e }; int operator+(int, E); // expected-note 0-1{{here}} int i[4 + e]; // expected-error 2{{variable length array}} expected-note 0-1{{non-constexpr}} } namespace dr488 { // dr488: yes c++11 template void f(T); void f(int); void g() { // FIXME: It seems CWG thought this should be a SFINAE failure prior to // allowing local types as template arguments. In C++98, we should either // allow local types as template arguments or treat this as a SFINAE // failure. enum E { e }; f(e); #if __cplusplus < 201103L // expected-error@-2 {{local type}} #endif } } // dr489: na namespace dr490 { // dr490: yes template struct X {}; struct A { typedef int T; struct K {}; // expected-note {{declared}} int f(T); int g(T); int h(X); int X::*i(); // expected-note {{previous}} int K::*j(); template T k(); operator X(); }; struct B { typedef char T; typedef int U; friend int A::f(T); friend int A::g(U); friend int A::h(X); // FIXME: Per this DR, these two are valid! That is another defect // (no number yet...) which will eventually supersede this one. friend int X::*A::i(); // expected-error {{return type}} friend int K::*A::j(); // expected-error {{undeclared identifier 'K'; did you mean 'A::K'?}} // ok, lookup finds B::T, not A::T, so return type matches friend char A::k(); friend int A::k(); // A conversion-type-id in a conversion-function-id is always looked up in // the class of the conversion function first. friend A::operator X(); }; } namespace dr491 { // dr491: dup 413 struct A {} a, b[3] = { a, {} }; A c[2] = { a, {}, b[1] }; // expected-error {{excess elements}} } // dr492 FIXME write a codegen test namespace dr493 { // dr493: dup 976 struct X { template operator const T &() const; }; void f() { if (X()) { } } } namespace dr494 { // dr494: dup 372 class A { class B {}; friend class C; }; class C : A::B { A::B x; class D : A::B { A::B y; }; }; } namespace dr495 { // dr495: 3.5 template struct S { operator int() { return T::error; } template operator U(); }; S s; long n = s; template struct S2 { template operator U(); operator int() { return T::error; } }; S2 s2; long n2 = s2; } namespace dr496 { // dr496: sup 2094 struct A { int n; }; struct B { volatile int n; }; int check1[ __is_trivially_copyable(const int) ? 1 : -1]; // This checks the dr2094 behavior, not dr496 int check2[ __is_trivially_copyable(volatile int) ? 1 : -1]; int check3[ __is_trivially_constructible(A, const A&) ? 1 : -1]; int check4[ __is_trivially_constructible(B, const B&) ? 1 : -1]; int check5[ __is_trivially_assignable(A, const A&) ? 1 : -1]; int check6[ __is_trivially_assignable(B, const B&) ? 1 : -1]; } namespace dr497 { // dr497: sup 253 void before() { struct S { mutable int i; }; const S cs; int S::*pm = &S::i; cs.*pm = 88; // expected-error {{not assignable}} } void after() { struct S { S() : i(0) {} mutable int i; }; const S cs; int S::*pm = &S::i; cs.*pm = 88; // expected-error {{not assignable}} } } namespace dr499 { // dr499: yes extern char str[]; void f() { throw str; } }