[C++] Fixes for three grokbitfield diagnostics

Message ID 03bbe624-10b0-cace-3770-f1d8e2f4bb44@oracle.com
State New
Headers show
Series
  • [C++] Fixes for three grokbitfield diagnostics
Related show

Commit Message

Paolo Carlini Dec. 7, 2018, 10:39 a.m.
Hi,

these should be more or less straightforward (now that 
DECL_SOURCE_LOCATION often extracts a proper location ;). In the case of 
warn_if_not_aligned I also removed the redundant width check (it's never 
null, double checked by running the instrumented testsuite too) and I 
also removed the DECL_NAME use, which definitely doesn't play well with 
unnamed declarations (other/bitfield7.C exercises that too).

Tested x86_64-linux, as usual.

Thanks, Paolo.

//////////////////////
/cp
2018-12-07  Paolo Carlini  <paolo.carlini@oracle.com>

	* decl2.c (grokbitfield): Use DECL_SOURCE_LOCATION in error messages
	about bit-fields with function type, warn_if_not_aligned type, and
	static bit-fields; avoid DECL_NAME for unnamed declarations.

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

	* g++.dg/other/bitfield7.C: New.
	* g++.dg/parse/bitfield8.C: Likewise.
	* g++.dg/parse/bitfield9.C: Likewise.
	* g++.dg/pr53037-4.C: Test the locations too.

Comments

Jason Merrill Dec. 7, 2018, 3:08 p.m. | #1
On 12/7/18 5:39 AM, Paolo Carlini wrote:
> Hi,

> 

> these should be more or less straightforward (now that 

> DECL_SOURCE_LOCATION often extracts a proper location ;). In the case of 

> warn_if_not_aligned I also removed the redundant width check (it's never 

> null, double checked by running the instrumented testsuite too) and I 

> also removed the DECL_NAME use, which definitely doesn't play well with 

> unnamed declarations (other/bitfield7.C exercises that too).

> 

> Tested x86_64-linux, as usual.

> 

> Thanks, Paolo.

> 

> //////////////////////

> 

OK.

Jason

Patch

Index: cp/decl2.c
===================================================================
--- cp/decl2.c	(revision 266884)
+++ cp/decl2.c	(working copy)
@@ -1046,15 +1046,15 @@  grokbitfield (const cp_declarator *declarator,
      check here.  */
   if (TREE_CODE (value) == FUNCTION_DECL)
     {
-      error ("cannot declare bit-field %qD with function type",
-	     DECL_NAME (value));
+      error_at (DECL_SOURCE_LOCATION (value),
+		"cannot declare bit-field %qD with function type", value);
       return NULL_TREE;
     }
 
-  if (width && TYPE_WARN_IF_NOT_ALIGN (type))
+  if (TYPE_WARN_IF_NOT_ALIGN (type))
     {
-      error ("cannot declare bit-field %qD with %<warn_if_not_aligned%> type",
-	     DECL_NAME (value));
+      error_at (DECL_SOURCE_LOCATION (value), "cannot declare bit-field "
+		"%qD with %<warn_if_not_aligned%> type", value);
       return NULL_TREE;
     }
 
@@ -1067,7 +1067,8 @@  grokbitfield (const cp_declarator *declarator,
 
   if (TREE_STATIC (value))
     {
-      error ("static member %qD cannot be a bit-field", value);
+      error_at (DECL_SOURCE_LOCATION (value),
+		"static member %qD cannot be a bit-field", value);
       return NULL_TREE;
     }
 
Index: testsuite/g++.dg/other/bitfield7.C
===================================================================
--- testsuite/g++.dg/other/bitfield7.C	(nonexistent)
+++ testsuite/g++.dg/other/bitfield7.C	(working copy)
@@ -0,0 +1,7 @@ 
+typedef int __attribute__((warn_if_not_aligned(8))) intwna;
+
+struct S
+{
+  intwna : 2;  // { dg-error "cannot declare bit-field" }
+  intwna i : 2;  // { dg-error "10:cannot declare bit-field .i." }
+};
Index: testsuite/g++.dg/parse/bitfield8.C
===================================================================
--- testsuite/g++.dg/parse/bitfield8.C	(nonexistent)
+++ testsuite/g++.dg/parse/bitfield8.C	(working copy)
@@ -0,0 +1,4 @@ 
+struct A
+{
+  static int a : 1;  // { dg-error "14:static member .a. cannot be a bit-field" }
+};
Index: testsuite/g++.dg/parse/bitfield9.C
===================================================================
--- testsuite/g++.dg/parse/bitfield9.C	(nonexistent)
+++ testsuite/g++.dg/parse/bitfield9.C	(working copy)
@@ -0,0 +1,6 @@ 
+template<typename T>
+struct A
+{
+  typedef T type();
+  type i : 2;  // { dg-error "8:cannot declare bit-field" }
+};
Index: testsuite/g++.dg/pr53037-4.C
===================================================================
--- testsuite/g++.dg/pr53037-4.C	(revision 266884)
+++ testsuite/g++.dg/pr53037-4.C	(working copy)
@@ -12,7 +12,7 @@  foo2 (void) /* { dg-error "'warn_if_not_aligned' m
 
 struct foo3
 {
-  int i : 2 __attribute__((warn_if_not_aligned(8))); /* { dg-error "'warn_if_not_aligned' may not be specified for 'i'" } */
+  int i : 2 __attribute__((warn_if_not_aligned(8))); /* { dg-error "7:'warn_if_not_aligned' may not be specified for 'i'" } */
 };
 
 typedef unsigned int __u32
@@ -20,5 +20,5 @@  typedef unsigned int __u32
 
 struct foo4
 {
-  __u32 i : 2; /* { dg-error "cannot declare bit-field 'i' with 'warn_if_not_aligned' type" } */
+  __u32 i : 2; /* { dg-error "9:cannot declare bit-field 'i' with 'warn_if_not_aligned' type" } */
 };