[C++] Improve grokbitfield location

Message ID 539bc022-1091-48d9-1b0a-4c53f7c1891e@oracle.com
State New
Headers show
Series
  • [C++] Improve grokbitfield location
Related show

Commit Message

Paolo Carlini Jan. 13, 2019, 11:21 p.m.
Hi,

today I realized that if we move further up the "famous" location_t loc 
declaration in grokdeclarator we can often pass a precise location when 
building TYPE_DECLs for typedef names too, thus, in particular, 
profitably use DECL_SOURCE_LOCATION in a grokbitfield error and also 
enabling further improvements. Tested x86_64-linux.

Thanks, Paolo.

///////////////////////
/cp
2019-01-13  Paolo Carlini  <paolo.carlini@oracle.com>

	* decl.c (grokdeclarator): Move further up the location_t loc
	declaration and use the location when building a TYPE_DECL for
	a typedef name.
	* decl2.c (grokbitfield): Use DECL_SOURCE_LOCATION in the error
	about an ill-formed typedef as bit-field.

/testsuite
2019-01-13  Paolo Carlini  <paolo.carlini@oracle.com>

	* g++.dg/diagnostic/bitfld3.C: New.

Comments

Jason Merrill Jan. 14, 2019, 8:07 p.m. | #1
On 1/13/19 6:21 PM, Paolo Carlini wrote:
> Hi,

> 

> today I realized that if we move further up the "famous" location_t loc 

> declaration in grokdeclarator we can often pass a precise location when 

> building TYPE_DECLs for typedef names too, thus, in particular, 

> profitably use DECL_SOURCE_LOCATION in a grokbitfield error and also 

> enabling further improvements. Tested x86_64-linux.


OK.

Jason

Patch

Index: cp/decl.c
===================================================================
--- cp/decl.c	(revision 267903)
+++ cp/decl.c	(working copy)
@@ -11933,6 +11934,8 @@  grokdeclarator (const cp_declarator *declarator,
 	}
     }
 
+  location_t loc = declarator ? declarator->id_loc : input_location;
+
   /* If this is declaring a typedef name, return a TYPE_DECL.  */
   if (typedef_p && decl_context != TYPENAME)
     {
@@ -11978,9 +11981,9 @@  grokdeclarator (const cp_declarator *declarator,
 	}
 
       if (decl_context == FIELD)
-	decl = build_lang_decl (TYPE_DECL, unqualified_id, type);
+	decl = build_lang_decl_loc (loc, TYPE_DECL, unqualified_id, type);
       else
-	decl = build_decl (input_location, TYPE_DECL, unqualified_id, type);
+	decl = build_decl (loc, TYPE_DECL, unqualified_id, type);
 
       if (decl_context != FIELD)
 	{
@@ -12221,7 +12224,6 @@  grokdeclarator (const cp_declarator *declarator,
 
   {
     tree decl = NULL_TREE;
-    location_t loc = declarator ? declarator->id_loc : input_location;
 
     if (decl_context == PARM)
       {
Index: cp/decl2.c
===================================================================
--- cp/decl2.c	(revision 267903)
+++ cp/decl2.c	(working copy)
@@ -1038,7 +1039,8 @@  grokbitfield (const cp_declarator *declarator,
 
   if (TREE_CODE (value) == TYPE_DECL)
     {
-      error ("cannot declare %qD to be a bit-field type", value);
+      error_at (DECL_SOURCE_LOCATION (value),
+		"cannot declare %qD to be a bit-field type", value);
       return NULL_TREE;
     }
 
Index: testsuite/g++.dg/diagnostic/bitfld3.C
===================================================================
--- testsuite/g++.dg/diagnostic/bitfld3.C	(nonexistent)
+++ testsuite/g++.dg/diagnostic/bitfld3.C	(working copy)
@@ -0,0 +1,5 @@ 
+struct S
+{
+  typedef int i : 3;  // { dg-error "15:cannot declare .i." }
+  typedef int : 3;  // { dg-error "cannot declare" }
+};