decl2.c (grokbitfield): Use DECL_SOURCE_LOCATION in error message...
authorPaolo Carlini <paolo.carlini@oracle.com>
Thu, 6 Dec 2018 08:23:04 +0000 (08:23 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Thu, 6 Dec 2018 08:23:04 +0000 (08:23 +0000)
/cp
2018-12-06  Paolo Carlini  <paolo.carlini@oracle.com>

* decl2.c (grokbitfield): Use DECL_SOURCE_LOCATION in error message;
print the type too; fix thinko in INDIRECT_TYPE_P use.

/testsuite
2018-12-06  Paolo Carlini  <paolo.carlini@oracle.com>

* g++.dg/parse/bitfield6b.C: New.
* g++.dg/parse/bitfield3.C: Test location and type.

From-SVN: r266841

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

index 3958992a57a56561c4ced6c7ad5faba38ad442c3..704e01defcfdec897092451874288257da4e4afc 100644 (file)
@@ -1,3 +1,8 @@
+2018-12-06  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       * decl2.c (grokbitfield): Use DECL_SOURCE_LOCATION in error message;
+       print the type too; fix thinko in INDIRECT_TYPE_P use.
+
 2018-12-05  Alexandre Oliva <aoliva@redhat.com>
 
        PR c++/85569
index ffc0d0d6ec4b7d9fdc5990b6ce478218e66886ac..79abdaebe861b9006e566e2bfecf0b41813cae77 100644 (file)
@@ -1016,18 +1016,21 @@ grokbitfield (const cp_declarator *declarator,
 
   if (value == error_mark_node)
     return NULL_TREE; /* friends went bad.  */
-  if (TREE_TYPE (value) == error_mark_node)
+
+  tree type = TREE_TYPE (value);
+  if (type == error_mark_node)
     return value;
 
   /* Pass friendly classes back.  */
   if (VOID_TYPE_P (value))
     return void_type_node;
 
-  if (!INTEGRAL_OR_ENUMERATION_TYPE_P (TREE_TYPE (value))
-      && (INDIRECT_TYPE_P (value)
-          || !dependent_type_p (TREE_TYPE (value))))
+  if (!INTEGRAL_OR_ENUMERATION_TYPE_P (type)
+      && (INDIRECT_TYPE_P (type) || !dependent_type_p (type)))
     {
-      error ("bit-field %qD with non-integral type", value);
+      error_at (DECL_SOURCE_LOCATION (value),
+               "bit-field %qD with non-integral type %qT",
+               value, type);
       return error_mark_node;
     }
 
@@ -1048,7 +1051,7 @@ grokbitfield (const cp_declarator *declarator,
       return NULL_TREE;
     }
 
-  if (width && TYPE_WARN_IF_NOT_ALIGN (TREE_TYPE (value)))
+  if (width && TYPE_WARN_IF_NOT_ALIGN (type))
     {
       error ("cannot declare bit-field %qD with %<warn_if_not_aligned%> type",
             DECL_NAME (value));
index d330d0eaba6a2ce5c11a1cc97048724983835c3a..922cc52a0a75082dc7b564606623089970d77524 100644 (file)
@@ -1,3 +1,8 @@
+2018-12-06  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       * g++.dg/parse/bitfield6b.C: New.
+       * g++.dg/parse/bitfield3.C: Test location and type.
+
 2018-12-06  Iain Sandoe  <iain@sandoe.co.uk>
 
        * lib/c-compat.exp (compat-use-alt-compiler):
index 387548a6827299aee6adbe8d27d8e9768529c3e1..efff2ec993e1180506e40ee2a8b07611a77037d4 100644 (file)
@@ -5,5 +5,5 @@ typedef void (func_type)();
 
 struct A
 {
-  friend func_type f : 2; /* { dg-error "with non-integral type" } */
+  friend func_type f : 2; /* { dg-error "20:bit-field .void f\\(\\). with non-integral type .func_type." } */
 };
diff --git a/gcc/testsuite/g++.dg/parse/bitfield6b.C b/gcc/testsuite/g++.dg/parse/bitfield6b.C
new file mode 100644 (file)
index 0000000..1cd99a5
--- /dev/null
@@ -0,0 +1,4 @@
+typedef void a();
+struct A {
+a a1: 1;  // { dg-error "3:bit-field .void A::a1\\(\\). with non-integral type .void \\(A::\\)\\(\\)." }
+};