DR 337 PR c++/9256
DR 337 PR c++/9256 * g++.dg/other/abstract1.C: New test. From-SVN: r75619
This commit is contained in:
parent
cfb91b67b8
commit
731bd3ae02
@ -1,3 +1,9 @@
|
|||||||
|
2004-01-10 Giovanni Bajo <giovannibajo@gcc.gnu.org>
|
||||||
|
|
||||||
|
DR 337
|
||||||
|
PR c++/9256
|
||||||
|
* g++.dg/other/abstract1.C: New test.
|
||||||
|
|
||||||
2004-01-09 Alexandre Oliva <aoliva@redhat.com>
|
2004-01-09 Alexandre Oliva <aoliva@redhat.com>
|
||||||
|
|
||||||
* g++.dg/lookup/strong-using-1.C: New.
|
* g++.dg/lookup/strong-using-1.C: New.
|
||||||
|
59
gcc/testsuite/g++.dg/other/abstract1.C
Normal file
59
gcc/testsuite/g++.dg/other/abstract1.C
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
// { dg-do compile }
|
||||||
|
// Contributed by <giovannibajo at gcc dot gnu dot org>,
|
||||||
|
// <pavel_vozenilek at hotmail dot com>,
|
||||||
|
// <bangerth at dealii dot org>
|
||||||
|
// c++/9256: Make sure that a pointer to an array of abstract elements
|
||||||
|
// cannot be created, not even during template substitution (DR337).
|
||||||
|
|
||||||
|
struct Abstract { virtual void f() = 0; }; // { dg-error "" }
|
||||||
|
struct Complete { void f(); };
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* TEST 1
|
||||||
|
* Arrays of abstract elements cannot be declared.
|
||||||
|
*/
|
||||||
|
|
||||||
|
Abstract a0[2]; // { dg-error "" }
|
||||||
|
Abstract (*a1)[2]; // { dg-error "" }
|
||||||
|
Abstract (**a2)[2]; // { dg-error "" }
|
||||||
|
Abstract (***a3)[2]; // { dg-error "" }
|
||||||
|
Abstract *a4;
|
||||||
|
Abstract *a5[2];
|
||||||
|
Abstract (*a6[2])[2]; // { dg-error "" }
|
||||||
|
Abstract **a7[2];
|
||||||
|
Abstract *(*a8[2])[2];
|
||||||
|
Abstract (**a9[2])[2]; // { dg-error "" }
|
||||||
|
|
||||||
|
/*
|
||||||
|
* TEST 2
|
||||||
|
* If a pointer to an array of abstract elements is created during template
|
||||||
|
* instantiation, an error should occur.
|
||||||
|
*/
|
||||||
|
|
||||||
|
template <class T> struct K {
|
||||||
|
T (*a)[2]; // { dg-error "abstract class type" }
|
||||||
|
};
|
||||||
|
|
||||||
|
template struct K<Abstract>; // { dg-error "from here" }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* TEST 3
|
||||||
|
* Deducing an array of abstract elements during type deduction is a silent
|
||||||
|
* failure (rejects overload).
|
||||||
|
*/
|
||||||
|
|
||||||
|
template <bool> struct StaticAssert;
|
||||||
|
template <> struct StaticAssert<true> {};
|
||||||
|
|
||||||
|
typedef char Yes;
|
||||||
|
typedef struct { char x[2]; } No;
|
||||||
|
|
||||||
|
template<typename U> No is_abstract(U (*k)[1]);
|
||||||
|
template<typename U> Yes is_abstract(...);
|
||||||
|
|
||||||
|
StaticAssert<sizeof(is_abstract<Abstract>(0)) == sizeof(Yes)> b1;
|
||||||
|
StaticAssert<sizeof(is_abstract<Complete>(0)) == sizeof(No)> b2;
|
||||||
|
StaticAssert<sizeof(is_abstract<int>(0)) == sizeof(No)> b3;
|
Loading…
Reference in New Issue
Block a user