[C++] Fix grokbitfield location

Message ID c6cbfd06-42de-05e5-0b24-16552162b3a4@oracle.com
State New
Headers show
Series
  • [C++] Fix grokbitfield location
Related show

Commit Message

Paolo Carlini Dec. 5, 2018, 12:45 p.m.
Hi,

as mentioned in one of my last patches, we can now improve this 
location. Note: in the same function there are a few further issues 
which I mean to incrementally fix (eg, the diagnostics for 
warn_if_not_aligned ICEs for unnamed bit-fields). Tested x86_64-linux.

Thanks, Paolo.

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

	* decl2.c (grokbitfield): USe DECL_SOURCE_LOCATION in error message.

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

	* g++.dg/parse/bitfield6b.C: New.

Comments

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

> 

> as mentioned in one of my last patches, we can now improve this 

> location. Note: in the same function there are a few further issues 

> which I mean to incrementally fix (eg, the diagnostics for 

> warn_if_not_aligned ICEs for unnamed bit-fields). Tested x86_64-linux.


As long as we're messing with this diagnostic, let's also print the type 
in question.

Jason
Paolo Carlini Dec. 5, 2018, 10:34 p.m. | #2
Hi,

On 05/12/18 20:31, Jason Merrill wrote:
> On 12/5/18 7:45 AM, Paolo Carlini wrote:

>> Hi,

>>

>> as mentioned in one of my last patches, we can now improve this 

>> location. Note: in the same function there are a few further issues 

>> which I mean to incrementally fix (eg, the diagnostics for 

>> warn_if_not_aligned ICEs for unnamed bit-fields). Tested x86_64-linux.

> As long as we're messing with this diagnostic, let's also print the 

> type in question.


Agreed. Thus I tested on x86_64-linux the below.

Thanks, Paolo.

/////////////////////
Index: cp/decl2.c
===================================================================
--- cp/decl2.c	(revision 266818)
+++ cp/decl2.c	(working copy)
@@ -1016,7 +1016,9 @@ 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.  */
@@ -1023,11 +1025,12 @@ grokbitfield (const cp_declarator *declarator,
   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 (value) || !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: testsuite/g++.dg/parse/bitfield3.C
===================================================================
--- testsuite/g++.dg/parse/bitfield3.C	(revision 266818)
+++ testsuite/g++.dg/parse/bitfield3.C	(working copy)
@@ -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." } */
 };
Index: testsuite/g++.dg/parse/bitfield6b.C
===================================================================
--- testsuite/g++.dg/parse/bitfield6b.C	(nonexistent)
+++ testsuite/g++.dg/parse/bitfield6b.C	(working copy)
@@ -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::\\)\\(\\)." }
+};
Jason Merrill Dec. 5, 2018, 10:52 p.m. | #3
On 12/5/18 5:34 PM, Paolo Carlini wrote:
> Hi,

> 

> On 05/12/18 20:31, Jason Merrill wrote:

>> On 12/5/18 7:45 AM, Paolo Carlini wrote:

>>> Hi,

>>>

>>> as mentioned in one of my last patches, we can now improve this 

>>> location. Note: in the same function there are a few further issues 

>>> which I mean to incrementally fix (eg, the diagnostics for 

>>> warn_if_not_aligned ICEs for unnamed bit-fields). Tested x86_64-linux.

>> As long as we're messing with this diagnostic, let's also print the 

>> type in question.

> 

> Agreed. Thus I tested on x86_64-linux the below.

> 

> Thanks, Paolo.

> 

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

> 

> 

> -  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 (value) || !dependent_type_p (type)))


Hmm, surely this should be INDIRECT_TYPE_P (type).  OK with that change.

Jason

Patch

Index: cp/decl2.c
===================================================================
--- cp/decl2.c	(revision 266818)
+++ cp/decl2.c	(working copy)
@@ -1027,7 +1027,8 @@  grokbitfield (const cp_declarator *declarator,
       && (INDIRECT_TYPE_P (value)
           || !dependent_type_p (TREE_TYPE (value))))
     {
-      error ("bit-field %qD with non-integral type", value);
+      error_at (DECL_SOURCE_LOCATION (value),
+		"bit-field %qD with non-integral type", value);
       return error_mark_node;
     }
 
Index: testsuite/g++.dg/parse/bitfield6b.C
===================================================================
--- testsuite/g++.dg/parse/bitfield6b.C	(nonexistent)
+++ testsuite/g++.dg/parse/bitfield6b.C	(working copy)
@@ -0,0 +1,4 @@ 
+typedef void a();
+struct A {
+a a1: 1;  // { dg-error "3:bit-field .void A::a1\\(\\). with non-integral type" }
+};