PR c++/28053
authorlmillward <lmillward@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 20 Oct 2006 20:13:42 +0000 (20:13 +0000)
committerlmillward <lmillward@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 20 Oct 2006 20:13:42 +0000 (20:13 +0000)
        * 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@117910 138bc75d-0d04-0410-961f-82ee72b054a4

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 356bc25..a0cfbc0 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 42e9240..3b23638 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 701c2e7..8634b8e 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 70fe5cb..2e07605 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;