// { dg-do compile }
|
// { dg-do compile }
|
// Contributed by ,
|
// Contributed by ,
|
// ,
|
// ,
|
//
|
//
|
// c++/9256: Make sure that a pointer to an array of abstract elements
|
// c++/9256: Make sure that a pointer to an array of abstract elements
|
// cannot be created, not even during template substitution (DR337).
|
// cannot be created, not even during template substitution (DR337).
|
|
|
struct Abstract { virtual void f() = 0; }; // { dg-error "" }
|
struct Abstract { virtual void f() = 0; }; // { dg-error "" }
|
struct Complete { void f(); };
|
struct Complete { void f(); };
|
|
|
|
|
/*
|
/*
|
* TEST 1
|
* TEST 1
|
* Arrays of abstract elements cannot be declared.
|
* Arrays of abstract elements cannot be declared.
|
*/
|
*/
|
|
|
Abstract a0[2]; // { dg-error "" }
|
Abstract a0[2]; // { dg-error "" }
|
Abstract (*a1)[2]; // { dg-error "" }
|
Abstract (*a1)[2]; // { dg-error "" }
|
Abstract (**a2)[2]; // { dg-error "" }
|
Abstract (**a2)[2]; // { dg-error "" }
|
Abstract (***a3)[2]; // { dg-error "" }
|
Abstract (***a3)[2]; // { dg-error "" }
|
Abstract *a4;
|
Abstract *a4;
|
Abstract *a5[2];
|
Abstract *a5[2];
|
Abstract (*a6[2])[2]; // { dg-error "" }
|
Abstract (*a6[2])[2]; // { dg-error "" }
|
Abstract **a7[2];
|
Abstract **a7[2];
|
Abstract *(*a8[2])[2];
|
Abstract *(*a8[2])[2];
|
Abstract (**a9[2])[2]; // { dg-error "" }
|
Abstract (**a9[2])[2]; // { dg-error "" }
|
|
|
/*
|
/*
|
* TEST 2
|
* TEST 2
|
* If a pointer to an array of abstract elements is created during template
|
* If a pointer to an array of abstract elements is created during template
|
* instantiation, an error should occur.
|
* instantiation, an error should occur.
|
*/
|
*/
|
|
|
template struct K {
|
template struct K {
|
T (*a)[2]; // { dg-error "abstract class type" }
|
T (*a)[2]; // { dg-error "abstract class type" }
|
};
|
};
|
|
|
template struct K; // { dg-error "from here" }
|
template struct K; // { dg-error "from here" }
|
|
|
|
|
|
|
/*
|
/*
|
* TEST 3
|
* TEST 3
|
* Deducing an array of abstract elements during type deduction is a silent
|
* Deducing an array of abstract elements during type deduction is a silent
|
* failure (rejects overload).
|
* failure (rejects overload).
|
*/
|
*/
|
|
|
template struct StaticAssert;
|
template struct StaticAssert;
|
template <> struct StaticAssert {};
|
template <> struct StaticAssert {};
|
|
|
typedef char Yes;
|
typedef char Yes;
|
typedef struct { char x[2]; } No;
|
typedef struct { char x[2]; } No;
|
|
|
template No is_abstract(U (*k)[1]);
|
template No is_abstract(U (*k)[1]);
|
template Yes is_abstract(...);
|
template Yes is_abstract(...);
|
|
|
StaticAssert(0)) == sizeof(Yes)> b1;
|
StaticAssert(0)) == sizeof(Yes)> b1;
|
StaticAssert(0)) == sizeof(No)> b2;
|
StaticAssert(0)) == sizeof(No)> b2;
|
StaticAssert(0)) == sizeof(No)> b3;
|
StaticAssert(0)) == sizeof(No)> b3;
|
|
|