aboutsummaryrefslogtreecommitdiff
path: root/test/CXX/drs/dr4xx.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'test/CXX/drs/dr4xx.cpp')
-rw-r--r--test/CXX/drs/dr4xx.cpp1229
1 files changed, 0 insertions, 1229 deletions
diff --git a/test/CXX/drs/dr4xx.cpp b/test/CXX/drs/dr4xx.cpp
deleted file mode 100644
index 00393cc2e4c0..000000000000
--- a/test/CXX/drs/dr4xx.cpp
+++ /dev/null
@@ -1,1229 +0,0 @@
-// 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 T, class U = typename T::type> 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<C>; // expected-note {{default argument}}
- };
-
- class D {
- typedef int type; // expected-note {{private}}
- friend class A<D, int>;
- };
-
- A<B> *b; // expected-note {{default argument}}
- A<D> *d; // expected-note {{in instantiation of default argument}}
-
- struct E {
- template<class T, class U = typename T::type> class A : public T {};
- };
- class F {
- typedef int type;
- friend class E;
- };
- E::A<F> 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<class T, class U = typename T::type> 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<typename T> struct X {};
- typedef struct X<A::S>::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;
-}
-
-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<int N> void g() { int arr[N != 1 ? 1 : -1]; }
- template<> void g<2>() { }
-
- template<typename T> struct S {
- static int i[];
- void f();
- };
- template<typename T> int S<T>::i[] = { 1 };
-
- template<typename T> void S<T>::f() {
- g<sizeof (i) / sizeof (int)>();
- }
- template<> int S<int>::i[] = { 1, 2 };
- template void S<int>::f(); // uses g<2>(), not g<1>().
-
-
- template<typename T> struct R {
- static int arr[];
- void f();
- };
- template<typename T> int R<T>::arr[1];
- template<typename T> void R<T>::f() {
- int arr[sizeof(arr) != sizeof(int) ? 1 : -1];
- }
- template<> int R<int>::arr[2];
- template void R<int>::f();
-}
-
-namespace dr409 { // dr409: yes
- template<typename T> struct A {
- typedef int B;
- B b1;
- A::B b2;
- A<T>::B b3;
- A<T*>::B b4; // expected-error {{missing 'typename'}}
- };
-}
-
-namespace dr410 { // dr410: no
- template<class T> void f(T);
- void g(int);
- namespace M {
- template<class T> void h(T);
- template<class T> void i(T);
- struct A {
- friend void f<>(int);
- friend void h<>(int);
- friend void g(int);
- template<class T> 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<typename T> 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<typename T> struct ptr {
- T *operator->() const;
- T &operator*() const;
- };
- template<typename T, typename P> void test(P p) {
- p->~T();
- p->T::~T();
- (*p).~T();
- (*p).T::~T();
- }
- struct X {};
- template void test<int>(int*);
- template void test<int>(ptr<int>);
- template void test<X>(X*);
- template void test<X>(ptr<X>);
-
- template<typename T>
- void test2(T p) {
- p->template Y<int>::~Y<int>();
- p->~Y<int>();
- // FIXME: This is ill-formed, but this diagnostic is terrible. We should
- // reject this in the parser.
- p->template ~Y<int>(); // expected-error 2{{no member named '~typename Y<int>'}}
- }
- template<typename T> struct Y {};
- template void test2(Y<int>*); // expected-note {{instantiation}}
- template void test2(ptr<Y<int> >); // expected-note {{instantiation}}
-
- void test3(int *p, ptr<int> q) {
- typedef int Int;
- p->~Int();
- q->~Int();
- p->Int::~Int();
- q->Int::~Int();
- }
-
-#if __cplusplus >= 201103L
- template<typename T> using id = T;
- struct A { template<typename T> using id = T; };
- void test4(int *p, ptr<int> q) {
- p->~id<int>();
- q->~id<int>();
- p->id<int>::~id<int>();
- q->id<int>::~id<int>();
- p->template id<int>::~id<int>(); // expected-error {{'template' keyword not permitted here}} expected-error {{base type 'int' is not a struct}}
- q->template id<int>::~id<int>(); // expected-error {{'template' keyword not permitted here}} expected-error {{base type 'int' is not a struct}}
- p->A::template id<int>::~id<int>();
- q->A::template id<int>::~id<int>();
- }
-#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<typename T, typename U> void f() {
- typedef T type; // expected-note {{prev}}
- typedef U type; // expected-error {{redef}}
- }
- template void f<int, int>();
- template void f<int, char>(); // expected-note {{instantiation}}
-}
-
-namespace dr423 { // dr423: yes
- template<typename T> struct X { operator T&(); };
- void f(X<int> 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<typename T> operator T() const; } a;
- float f = 1.0f * a; // expected-error {{ambiguous}} expected-note 5+{{built-in candidate}}
-
- template<typename T> struct is_float;
- template<> struct is_float<float> { typedef void type; };
-
- struct B {
- template<typename T, typename U = typename is_float<T>::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<const D&>(b);
- const D &d3 = (const D&)b;
- const D &d4(b); // expected-error {{deleted}}
-}
-
-namespace dr428 { // dr428: yes
- template<typename T> T make();
- extern struct X x; // expected-note 5{{forward declaration}}
- void f() {
- throw void(); // expected-error {{cannot throw}}
- throw make<void*>();
- throw make<const volatile void*>();
- throw x; // expected-error {{cannot throw}}
- throw make<X&>(); // expected-error {{cannot throw}}
- throw make<X*>(); // expected-error {{cannot throw}}
- throw make<const volatile X&>(); // expected-error {{cannot throw}}
- throw make<const volatile X*>(); // 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<typename T> T *get();
- template<typename T> struct B {
- template<typename U> U *get();
- };
- };
-
- template<typename T> void f(A a) {
- a.get<A>()->get<T>();
- a.get<T>()
- ->get<T>(); // expected-error {{use 'template'}}
- a.get<T>()->template get<T>();
- a.A::get<T>();
- A::B<int> *b = a.get<A::B<int> >();
- b->get<int>();
- b->A::B<int>::get<int>();
- b->A::B<int>::get<T>();
- b->A::B<T>::get<int>(); // expected-error {{use 'template'}}
- b->A::B<T>::template get<int>();
- b->A::B<T>::get<T>(); // expected-error {{use 'template'}}
- b->A::B<T>::template get<T>();
- A::B<T> *c = a.get<A::B<T> >();
- c->get<int>(); // expected-error {{use 'template'}}
- c->template get<int>();
- }
-}
-
-namespace dr432 { // dr432: yes
- template<typename T> struct A {};
- template<typename T> struct B : A<B> {}; // expected-error {{requires template arguments}} expected-note {{declared}}
- template<typename T> struct C : A<C<T> > {};
-#if __cplusplus >= 201103L
- template<typename T> struct D : decltype(A<D>()) {}; // expected-error {{requires template arguments}} expected-note {{declared}}
-#endif
-}
-
-namespace dr433 { // dr433: yes
- template<class T> struct S {
- void f(union U*);
- };
- U *p;
- template<class T> void S<T>::f(union U*) {}
-
- S<int> s;
-}
-
-namespace dr434 { // dr434: yes
- void f() {
- const int ci = 0;
- int *pi = 0;
- const int *&rpci = pi; // expected-error {{cannot bind}}
- rpci = &ci;
- *pi = 1;
- }
-}
-
-// 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<typename U> 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<S>);
-#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<int> struct U {
- typedef int type;
- template<typename V> static void h();
- };
- template<typename T> U<sizeof(T)> g(T);
- template<typename T, int N> void f(int n) {
- // ok, not type dependent
- g(__builtin_offsetof(A, n)).h<int>();
- g(__builtin_offsetof(T, n)).h<int>();
- // 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<int>();
- g(__builtin_offsetof(A, a[N])).h<int>();
- 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<typename T = int> void f(int); // expected-error 0-1{{extension}} expected-note {{no known conversion}}
- template<typename T> void g(T t) {
- f<T>(t); // expected-error {{neither visible in the template definition nor found by argument-dependent lookup}}
- dr448::f(t); // expected-error {{no matching function}}
- }
- template<typename T> 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}}
- int arr[b]; // expected-error +{{variable length arr}}
-}
-
-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}}
-
- enum E {
- ea = a,
- eb = b // expected-error {{constant}} expected-note {{read of volatile-qualified}}
- };
-}
-
-namespace dr458 { // dr458: no
- struct A {
- int T;
- int f();
- template<typename> int g();
- };
-
- template<typename> struct B : A {
- int f();
- template<typename> int g();
- template<typename> int h();
- };
-
- int A::f() {
- return T;
- }
- template<typename T>
- int A::g() {
- return T; // FIXME: this is invalid, it finds the template parameter
- }
-
- template<typename T>
- int B<T>::f() {
- return T;
- }
- template<typename T> template<typename U>
- int B<T>::g() {
- return T;
- }
- template<typename U> template<typename T>
- int B<U>::h() {
- return T; // FIXME: this is invalid, it finds the template parameter
- }
-}
-
-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<typename> struct A {
- template<typename> struct B {
- static int C;
- };
- };
- int k = dr468::template A<int>::template B<char>::C;
-#if __cplusplus < 201103L
- // expected-error@-2 2{{'template' keyword outside of a template}}
-#endif
-}
-
-namespace dr469 { // dr469: no
- template<typename T> struct X; // expected-note {{here}}
- template<typename T> struct X<const T> {};
- X<int&> x; // expected-error {{undefined}}
-}
-
-namespace dr470 { // dr470: yes
- template<typename T> struct A {
- struct B {};
- };
- template<typename T> struct C {
- };
-
- template struct A<int>; // expected-note {{previous}}
- template struct A<int>::B; // expected-error {{duplicate explicit instantiation}}
-
- // ok, instantiating C<char> doesn't instantiate base class members.
- template struct A<char>;
- template struct C<char>;
-}
-
-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<int A::*>(c); // expected-error {{virtual base}}
-
- D *e;
- A *f = e;
- D *g = static_cast<D*>(f); // expected-error {{virtual base}}
-
- extern D &i;
- A &j = i;
- D &k = static_cast<D&>(j); // expected-error {{virtual base}}
-}
-
-namespace dr481 { // dr481: yes
- template<class T, T U> class A { T *x; };
- T *x; // expected-error {{unknown type}}
-
- template<class T *U> class B { T *x; };
- T *y; // ok
-
- struct C {
- template<class T> void f(class D *p);
- };
- D *z; // ok
-
- template<typename A = C, typename C = A> 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<int>; // expected-note {{instantiation of}}
-
- template<template<typename U_no_typo_correction> class A,
- A<int> *B,
- U_no_typo_correction *C> // expected-error {{unknown type}}
- struct F {
- U_no_typo_correction *x; // expected-error {{unknown type}}
- };
-
- template<template<class H *> class> struct G {
- H *x;
- };
- H *q;
-
- typedef int N;
- template<N X, typename N, template<N Y> class T> struct I;
- template<char*> 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<typename T> int f(S);
- }
- template<typename T> int f();
-
- N::S s;
- int a = operator+(s, s);
- int b = f<int>(s);
-}
-
-namespace dr486 { // dr486: yes
- template<typename T> 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<void()>(&g); // expected-error {{no match}}
- f<int[10]>(&n); // expected-error {{no match}}
- }
-}
-
-namespace dr487 { // dr487: yes
- enum E { e };
- int operator+(int, E);
- int i[4 + e]; // expected-error 2{{variable length array}}
-}
-
-namespace dr488 { // dr488: yes c++11
- template <typename T> 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<typename T> struct X {};
-
- struct A {
- typedef int T;
- struct K {}; // expected-note {{declared}}
-
- int f(T);
- int g(T);
- int h(X<T>);
- int X<T>::*i(); // expected-note {{previous}}
- int K::*j();
-
- template<typename T> T k();
-
- operator X<T>();
- };
-
- struct B {
- typedef char T;
- typedef int U;
- friend int A::f(T);
- friend int A::g(U);
- friend int A::h(X<T>);
-
- // FIXME: Per this DR, these two are valid! That is another defect
- // (no number yet...) which will eventually supersede this one.
- friend int X<T>::*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<T>();
- friend int A::k<U>();
-
- // 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<T>();
- };
-}
-
-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 <class T> 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<typename T>
- struct S {
- operator int() { return T::error; }
- template<typename U> operator U();
- };
- S<int> s;
- long n = s;
-
- template<typename T>
- struct S2 {
- template<typename U> operator U();
- operator int() { return T::error; }
- };
- S2<int> 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; }
-}