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>
|
||||
|
||||
* 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