]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
DR 337 PR c++/9256
authorGiovanni Bajo <giovannibajo@gcc.gnu.org>
Sat, 10 Jan 2004 01:22:06 +0000 (01:22 +0000)
committerGiovanni Bajo <giovannibajo@gcc.gnu.org>
Sat, 10 Jan 2004 01:22:06 +0000 (01:22 +0000)
DR 337
PR c++/9256
* g++.dg/other/abstract1.C: New test.

From-SVN: r75619

gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/other/abstract1.C [new file with mode: 0644]

index a9276de938987e88bce45bace1b5e7b7a4eace6b..0d4b3d6438ed6f58aee309510f078cbdce368fab 100644 (file)
@@ -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.
diff --git a/gcc/testsuite/g++.dg/other/abstract1.C b/gcc/testsuite/g++.dg/other/abstract1.C
new file mode 100644 (file)
index 0000000..86962c7
--- /dev/null
@@ -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;