re PR c++/28053 (ICE deriving from class with invalid bitfield)
authorLee Millward <lee.millward@codesourcery.com>
Fri, 20 Oct 2006 20:13:42 +0000 (20:13 +0000)
committerLee Millward <lmillward@gcc.gnu.org>
Fri, 20 Oct 2006 20:13:42 +0000 (20:13 +0000)
        PR c++/28053
        * decl2.c (grokbitfield): Detect invalid non-integral
        types earlier when possible.

        * g++.dg/parse/bitfield1.C: Adjust error markers.
        * g++.dg/parse/bitfield2.C: New test.

Co-Authored-By: Mark Mitchell <mark@codesourcery.com>
From-SVN: r117910

gcc/cp/ChangeLog
gcc/cp/decl2.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/parse/bitfield1.C
gcc/testsuite/g++.dg/parse/bitfield2.C [new file with mode: 0644]

index 356bc25d451ded0a318994e0d8d8de8eef4004b7..a0cfbc0bf39f5dae5465e376a317bd36b7c61ec2 100644 (file)
@@ -1,3 +1,10 @@
+2006-10-20  Lee Millward  <lee.millward@codesourcery.com>
+            Mark Mitchell <mark@codesourcery.com>
+
+        PR c++/28053
+        * decl2.c (grokbitfield): Detect invalid non-integral 
+        types earlier when possible.
+       
 2006-10-18  Mark Shinwell  <shinwell@codesourcery.com>
 
        PR c++/26884
index 42e924000f8185b82fc95138d3ea97adb8692c32..3b23638e71ad1a12d12848b700562075c7b34b8c 100644 (file)
@@ -946,6 +946,14 @@ grokbitfield (const cp_declarator *declarator,
   if (TREE_CODE (value) == VOID_TYPE)
     return void_type_node;
 
+  if (!INTEGRAL_TYPE_P (TREE_TYPE (value))
+      && (POINTER_TYPE_P (value)
+          || !dependent_type_p (TREE_TYPE (value))))
+    {
+      error ("bit-field %qD with non-integral type", value);
+      return error_mark_node;
+    }
+
   if (TREE_CODE (value) == TYPE_DECL)
     {
       error ("cannot declare %qD to be a bit-field type", value);
index 701c2e7ed5ed08ae35f826c153aafb44be0a0b72..8634b8e41ec32b2e0398b942ef63b38c783393ad 100644 (file)
@@ -1,3 +1,9 @@
+2006-10-20  Lee Millward  <lee.millward@codesourcery.com>
+        
+        PR c++/28053
+        * g++.dg/parse/bitfield1.C: Adjust error markers.
+        * g++.dg/parse/bitfield2.C: New test. 
+       
 2006-10-20  Adam Nemet  <anemet@caviumnetworks.com>
 
        * gcc.dg/tree-ssa/ivopts-2.c: Match final candidates line only.
index 70fe5cbd7148208cdc841cf37193941f970182bb..2e076058508fbdbfe724d7addacb9eb36aaec516 100644 (file)
@@ -7,5 +7,5 @@ struct A
 
 void foo(A& a)
 {
-  (char)a.i;
+  (char)a.i;    // { dg-error "no member" }
 }
diff --git a/gcc/testsuite/g++.dg/parse/bitfield2.C b/gcc/testsuite/g++.dg/parse/bitfield2.C
new file mode 100644 (file)
index 0000000..49aace1
--- /dev/null
@@ -0,0 +1,34 @@
+//PR c++/28053
+
+struct X {};
+
+struct A
+{
+    X x : 2;            // { dg-error "non-integral type" }
+};
+struct B : A {};
+
+template <typename T>
+struct C
+{
+  T t : 3;
+};
+
+C<int> c;
+
+template <typename T>
+struct D
+{
+  T t : 3;              // { dg-error "non-integral type" }
+};
+
+D<double> d;            // { dg-error "instantiated" }
+
+template <typename T>
+struct E
+{
+  typedef T* U;
+  U t : 3;             // { dg-error "non-integral type" }
+};
+
+E<double> e;