Patch to use %E and %D in more diagnostics

Joseph S. Myers joseph@codesourcery.com
Fri Mar 18 21:00:00 GMT 2005


This patch changes various diagnostics in the C front end to use %E or
%D instead of %qs on identifiers.

This is an example of the sort of changes involved in ensuring that
extended identifiers do not cause problems in diagnostics.  By
centralising the code that extracts an identifier's byte sequence for
a diagnostic in one place, fewer uses of IDENTIFIER_POINTER need
auditing and only that one place needs to be changed to handle that
identifier according to the locale character set.

This patch *does not* address all C diagnostics or all C references to
IDENTIFIER_POINTER; only the easier ones.  An audit needs to cover
every reference to IDENTIFIER_POINTER and show that it can handle
extended identifiers, fix it if it can't or remove it to reduce the
number that need auditing.

There are also diagnostics outside the C and C++ front ends using
IDENTIFIER_POINTER.

This patch *does not* touch the C++ front end.

This patch *does not* make the changes needed to format extended
identifiers specially.

Many places changed could not have involved extended identifiers.  The
change is still justified as a general cleanup.

If identifiers cease to have the static type of "tree", the %E format
will need to be split into two formats, %E for expressions and
something else for identifiers.  Very few diagnostics can have both so
the increase in the number of uses of %E which would need changing
should not be a problem.

Bootstrapped with no regressions on x86_64-unknown-linux-gnu, and
verified that no diagnostics in gcc.log change with this patch.
Applied to mainline.

-- 
Joseph S. Myers               http://www.srcf.ucam.org/~jsm28/gcc/
    jsm@polyomino.org.uk (personal mail)
    joseph@codesourcery.com (CodeSourcery mail)
    jsm28@gcc.gnu.org (Bugzilla assignments and CCs)

2005-03-18  Joseph S. Myers  <joseph@codesourcery.com>

	* c-common.c, c-decl.c, c-format.c, c-typeck.c: Use %D for
	declarations in diagnostics and %E for identifiers, not %s.

diff -rupN GCC.orig/gcc/c-common.c GCC/gcc/c-common.c
--- GCC.orig/gcc/c-common.c	2005-03-14 21:11:07.000000000 +0000
+++ GCC/gcc/c-common.c	2005-03-18 00:14:48.000000000 +0000
@@ -1146,8 +1146,7 @@ warn_for_collisions_1 (tree written, tre
 	  && DECL_NAME (list->expr))
 	{
 	  warned_ids = new_tlist (warned_ids, written, NULL_TREE);
-	  warning ("operation on %qs may be undefined",
-		   IDENTIFIER_POINTER (DECL_NAME (list->expr)));
+	  warning ("operation on %qE may be undefined", list->expr);
 	}
       list = list->next;
     }
@@ -3958,7 +3957,7 @@ handle_packed_attribute (tree *node, tre
      that changes what the typedef is typing.  */
   else
     {
-      warning ("%qs attribute ignored", IDENTIFIER_POINTER (name));
+      warning ("%qE attribute ignored", name);
       *no_add_attrs = true;
     }
 
@@ -3977,7 +3976,7 @@ handle_nocommon_attribute (tree *node, t
     DECL_COMMON (*node) = 0;
   else
     {
-      warning ("%qs attribute ignored", IDENTIFIER_POINTER (name));
+      warning ("%qE attribute ignored", name);
       *no_add_attrs = true;
     }
 
@@ -3995,7 +3994,7 @@ handle_common_attribute (tree *node, tre
     DECL_COMMON (*node) = 1;
   else
     {
-      warning ("%qs attribute ignored", IDENTIFIER_POINTER (name));
+      warning ("%qE attribute ignored", name);
       *no_add_attrs = true;
     }
 
@@ -4022,7 +4021,7 @@ handle_noreturn_attribute (tree *node, t
 			     TYPE_READONLY (TREE_TYPE (type)), 1));
   else
     {
-      warning ("%qs attribute ignored", IDENTIFIER_POINTER (name));
+      warning ("%qE attribute ignored", name);
       *no_add_attrs = true;
     }
 
@@ -4041,7 +4040,7 @@ handle_noinline_attribute (tree *node, t
     DECL_UNINLINABLE (*node) = 1;
   else
     {
-      warning ("%qs attribute ignored", IDENTIFIER_POINTER (name));
+      warning ("%qE attribute ignored", name);
       *no_add_attrs = true;
     }
 
@@ -4064,7 +4063,7 @@ handle_always_inline_attribute (tree *no
     }
   else
     {
-      warning ("%qs attribute ignored", IDENTIFIER_POINTER (name));
+      warning ("%qE attribute ignored", name);
       *no_add_attrs = true;
     }
 
@@ -4088,7 +4087,7 @@ handle_used_attribute (tree *pnode, tree
     }
   else
     {
-      warning ("%qs attribute ignored", IDENTIFIER_POINTER (name));
+      warning ("%qE attribute ignored", name);
       *no_add_attrs = true;
     }
 
@@ -4114,7 +4113,7 @@ handle_unused_attribute (tree *node, tre
 	TREE_USED (decl) = 1;
       else
 	{
-	  warning ("%qs attribute ignored", IDENTIFIER_POINTER (name));
+	  warning ("%qE attribute ignored", name);
 	  *no_add_attrs = true;
 	}
     }
@@ -4148,7 +4147,7 @@ handle_const_attribute (tree *node, tree
 			     TREE_THIS_VOLATILE (TREE_TYPE (type))));
   else
     {
-      warning ("%qs attribute ignored", IDENTIFIER_POINTER (name));
+      warning ("%qE attribute ignored", name);
       *no_add_attrs = true;
     }
 
@@ -4192,7 +4191,7 @@ handle_transparent_union_attribute (tree
     DECL_TRANSPARENT_UNION (decl) = 1;
   else
     {
-      warning ("%qs attribute ignored", IDENTIFIER_POINTER (name));
+      warning ("%qE attribute ignored", name);
       *no_add_attrs = true;
     }
 
@@ -4220,7 +4219,7 @@ handle_constructor_attribute (tree *node
     }
   else
     {
-      warning ("%qs attribute ignored", IDENTIFIER_POINTER (name));
+      warning ("%qE attribute ignored", name);
       *no_add_attrs = true;
     }
 
@@ -4248,7 +4247,7 @@ handle_destructor_attribute (tree *node,
     }
   else
     {
-      warning ("%qs attribute ignored", IDENTIFIER_POINTER (name));
+      warning ("%qE attribute ignored", name);
       *no_add_attrs = true;
     }
 
@@ -4267,7 +4266,7 @@ handle_mode_attribute (tree *node, tree 
   *no_add_attrs = true;
 
   if (TREE_CODE (TREE_VALUE (args)) != IDENTIFIER_NODE)
-    warning ("%qs attribute ignored", IDENTIFIER_POINTER (name));
+    warning ("%qE attribute ignored", name);
   else
     {
       int j;
@@ -4598,7 +4597,7 @@ handle_alias_attribute (tree *node, tree
     }
   else
     {
-      warning ("%qs attribute ignored", IDENTIFIER_POINTER (name));
+      warning ("%qE attribute ignored", name);
       *no_add_attrs = true;
     }
 
@@ -4622,14 +4621,13 @@ handle_visibility_attribute (tree *node,
     {
       if (TREE_CODE (*node) != RECORD_TYPE && TREE_CODE (*node) != UNION_TYPE)
        {
-         warning ("%qs attribute ignored on non-class types",
-                  IDENTIFIER_POINTER (name));
+         warning ("%qE attribute ignored on non-class types", name);
          return NULL_TREE;
        }
     }
   else if (decl_function_context (decl) != 0 || !TREE_PUBLIC (decl))
     {
-      warning ("%qs attribute ignored", IDENTIFIER_POINTER (name));
+      warning ("%qE attribute ignored", name);
       return NULL_TREE;
     }
 
@@ -4721,7 +4719,7 @@ handle_tls_model_attribute (tree *node, 
 
   if (!DECL_THREAD_LOCAL (decl))
     {
-      warning ("%qs attribute ignored", IDENTIFIER_POINTER (name));
+      warning ("%qE attribute ignored", name);
       *no_add_attrs = true;
     }
   else
@@ -4788,7 +4786,7 @@ handle_malloc_attribute (tree *node, tre
   /* ??? TODO: Support types.  */
   else
     {
-      warning ("%qs attribute ignored", IDENTIFIER_POINTER (name));
+      warning ("%qE attribute ignored", name);
       *no_add_attrs = true;
     }
 
@@ -4806,7 +4804,7 @@ handle_returns_twice_attribute (tree *no
     DECL_IS_RETURNS_TWICE (*node) = 1;
   else
     {
-      warning ("%qs attribute ignored", IDENTIFIER_POINTER (name));
+      warning ("%qE attribute ignored", name);
       *no_add_attrs = true;
     }
 
@@ -4852,7 +4850,7 @@ handle_pure_attribute (tree *node, tree 
   /* ??? TODO: Support types.  */
   else
     {
-      warning ("%qs attribute ignored", IDENTIFIER_POINTER (name));
+      warning ("%qE attribute ignored", name);
       *no_add_attrs = true;
     }
 
@@ -4882,7 +4880,7 @@ handle_deprecated_attribute (tree *node,
 {
   tree type = NULL_TREE;
   int warn = 0;
-  const char *what = NULL;
+  tree what = NULL_TREE;
 
   if (DECL_P (*node))
     {
@@ -4914,17 +4912,15 @@ handle_deprecated_attribute (tree *node,
       if (type && TYPE_NAME (type))
 	{
 	  if (TREE_CODE (TYPE_NAME (type)) == IDENTIFIER_NODE)
-	    what = IDENTIFIER_POINTER (TYPE_NAME (*node));
+	    what = TYPE_NAME (*node);
 	  else if (TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
 		   && DECL_NAME (TYPE_NAME (type)))
-	    what = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type)));
+	    what = DECL_NAME (TYPE_NAME (type));
 	}
       if (what)
-	warning ("%qs attribute ignored for %qs",
-		  IDENTIFIER_POINTER (name), what);
+	warning ("%qE attribute ignored for %qE", name, what);
       else
-	warning ("%qs attribute ignored",
-		      IDENTIFIER_POINTER (name));
+	warning ("%qE attribute ignored", name);
     }
 
   return NULL_TREE;
@@ -4952,7 +4948,7 @@ handle_vector_size_attribute (tree *node
 
   if (!host_integerp (size, 1))
     {
-      warning ("%qs attribute ignored", IDENTIFIER_POINTER (name));
+      warning ("%qE attribute ignored", name);
       return NULL_TREE;
     }
 
@@ -4981,8 +4977,7 @@ handle_vector_size_attribute (tree *node
 	  && GET_MODE_CLASS (orig_mode) != MODE_INT)
       || !host_integerp (TYPE_SIZE_UNIT (type), 1))
     {
-      error ("invalid vector type for attribute %qs",
-	     IDENTIFIER_POINTER (name));
+      error ("invalid vector type for attribute %qE", name);
       return NULL_TREE;
     }
 
@@ -5231,7 +5226,7 @@ handle_nothrow_attribute (tree *node, tr
   /* ??? TODO: Support types.  */
   else
     {
-      warning ("%qs attribute ignored", IDENTIFIER_POINTER (name));
+      warning ("%qE attribute ignored", name);
       *no_add_attrs = true;
     }
 
@@ -5254,7 +5249,7 @@ handle_cleanup_attribute (tree *node, tr
      we'd be missing too much, since we do have attribute constructor.  */
   if (TREE_CODE (decl) != VAR_DECL || TREE_STATIC (decl))
     {
-      warning ("%qs attribute ignored", IDENTIFIER_POINTER (name));
+      warning ("%qE attribute ignored", name);
       *no_add_attrs = true;
       return NULL_TREE;
     }
@@ -5293,7 +5288,7 @@ handle_warn_unused_result_attribute (tre
   /* Ignore the attribute for functions not returning any value.  */
   if (VOID_TYPE_P (TREE_TYPE (*node)))
     {
-      warning ("%qs attribute ignored", IDENTIFIER_POINTER (name));
+      warning ("%qE attribute ignored", name);
       *no_add_attrs = true;
     }
 
@@ -5310,8 +5305,7 @@ handle_sentinel_attribute (tree *node, t
 
   if (!params)
     {
-      warning ("%qs attribute requires prototypes with named arguments",
-               IDENTIFIER_POINTER (name));
+      warning ("%qE attribute requires prototypes with named arguments", name);
       *no_add_attrs = true;
     }
   else
@@ -5321,8 +5315,7 @@ handle_sentinel_attribute (tree *node, t
 
       if (VOID_TYPE_P (TREE_VALUE (params)))
         {
-	  warning ("%qs attribute only applies to variadic functions",
-		   IDENTIFIER_POINTER (name));
+	  warning ("%qE attribute only applies to variadic functions", name);
 	  *no_add_attrs = true;
 	}
     }
@@ -5567,8 +5560,8 @@ c_parse_error (const char *msgid, enum c
     message = catenate_messages (msgid, " before numeric constant");
   else if (token == CPP_NAME)
     {
-      message = catenate_messages (msgid, " before %qs");
-      error (message, IDENTIFIER_POINTER (value));
+      message = catenate_messages (msgid, " before %qE");
+      error (message, value);
       free (message);
       message = NULL;
     }
@@ -5712,7 +5705,7 @@ fold_offsetof_1 (tree expr)
       if (DECL_C_BIT_FIELD (t))
 	{
 	  error ("attempt to take address of bit-field structure "
-		 "member %qs", IDENTIFIER_POINTER (DECL_NAME (t)));
+		 "member %qD", t);
 	  return error_mark_node;
 	}
       off = size_binop (PLUS_EXPR, DECL_FIELD_OFFSET (t),
diff -rupN GCC.orig/gcc/c-decl.c GCC/gcc/c-decl.c
--- GCC.orig/gcc/c-decl.c	2005-03-14 21:11:07.000000000 +0000
+++ GCC/gcc/c-decl.c	2005-03-18 00:17:58.000000000 +0000
@@ -2370,8 +2370,7 @@ lookup_label (tree name)
 
   if (current_function_decl == 0)
     {
-      error ("label %qs referenced outside of any function",
-	     IDENTIFIER_POINTER (name));
+      error ("label %qE referenced outside of any function", name);
       return 0;
     }
 
@@ -2413,7 +2412,7 @@ declare_label (tree name)
      at this scope */
   if (b && B_IN_CURRENT_SCOPE (b))
     {
-      error ("duplicate label declaration %qs", IDENTIFIER_POINTER (name));
+      error ("duplicate label declaration %qE", name);
       locate_old_decl (b->decl, error);
 
       /* Just use the previous declaration.  */
@@ -2471,8 +2470,7 @@ define_label (location_t location, tree 
 
   if (warn_traditional && !in_system_header && lookup_name (name))
     warning ("%Htraditional C lacks a separate namespace for labels, "
-             "identifier %qs conflicts", &location,
-	     IDENTIFIER_POINTER (name));
+             "identifier %qE conflicts", &location, name);
 
   /* Mark label as having been defined.  */
   DECL_INITIAL (label) = error_mark_node;
@@ -2536,9 +2534,8 @@ void
 pending_xref_error (void)
 {
   if (pending_invalid_xref != 0)
-    error ("%H%qs defined as wrong kind of tag",
-           &pending_invalid_xref_location,
-           IDENTIFIER_POINTER (pending_invalid_xref));
+    error ("%H%qE defined as wrong kind of tag",
+           &pending_invalid_xref_location, pending_invalid_xref);
   pending_invalid_xref = 0;
 }
 
@@ -5008,18 +5005,16 @@ start_struct (enum tree_code code, tree 
       if (TYPE_SIZE (ref))
         {
 	  if (code == UNION_TYPE)
-	    error ("redefinition of %<union %s%>", IDENTIFIER_POINTER (name));
+	    error ("redefinition of %<union %E%>", name);
           else
-	    error ("redefinition of %<struct %s%>", IDENTIFIER_POINTER (name));
+	    error ("redefinition of %<struct %E%>", name);
 	}
       else if (C_TYPE_BEING_DEFINED (ref))
 	{
 	  if (code == UNION_TYPE)
-	    error ("nested redefinition of %<union %s%>",
-		   IDENTIFIER_POINTER (name));
+	    error ("nested redefinition of %<union %E%>", name);
           else
-	    error ("nested redefinition of %<struct %s%>",
-		   IDENTIFIER_POINTER (name));
+	    error ("nested redefinition of %<struct %E%>", name);
 	}
     }
   else
@@ -5454,14 +5449,14 @@ start_enum (tree name)
     }
 
   if (C_TYPE_BEING_DEFINED (enumtype))
-    error ("nested redefinition of %<enum %s%>", IDENTIFIER_POINTER (name));
+    error ("nested redefinition of %<enum %E%>", name);
 
   C_TYPE_BEING_DEFINED (enumtype) = 1;
 
   if (TYPE_VALUES (enumtype) != 0)
     {
       /* This enum is a named one that has been declared already.  */
-      error ("redeclaration of %<enum %s%>", IDENTIFIER_POINTER (name));
+      error ("redeclaration of %<enum %E%>", name);
 
       /* Completely replace its old definition.
 	 The old enumerators remain defined, however.  */
@@ -6799,7 +6794,7 @@ declspecs_add_qual (struct c_declspecs *
       gcc_unreachable ();
     }
   if (dupe && pedantic && !flag_isoc99)
-    pedwarn ("duplicate %qs", IDENTIFIER_POINTER (qual));
+    pedwarn ("duplicate %qE", qual);
   return specs;
 }
 
@@ -6950,7 +6945,7 @@ declspecs_add_type (struct c_declspecs *
 	    }
 
 	  if (dupe)
-	    error ("duplicate %qs", IDENTIFIER_POINTER (type));
+	    error ("duplicate %qE", type);
 
 	  return specs;
 	}
@@ -7079,8 +7074,7 @@ declspecs_add_type (struct c_declspecs *
     {
       tree t = lookup_name (type);
       if (!t || TREE_CODE (t) != TYPE_DECL)
-	error ("%qs fails to be a typedef or built in type",
-	       IDENTIFIER_POINTER (type));
+	error ("%qE fails to be a typedef or built in type", type);
       else if (TREE_TYPE (t) == error_mark_node)
 	;
       else
@@ -7112,8 +7106,7 @@ declspecs_add_scspec (struct c_declspecs
 	      && C_IS_RESERVED_WORD (scspec));
   i = C_RID_CODE (scspec);
   if (extra_warnings && specs->non_sc_seen_p)
-    warning ("%qs is not at beginning of declaration",
-	     IDENTIFIER_POINTER (scspec));
+    warning ("%qE is not at beginning of declaration", scspec);
   switch (i)
     {
     case RID_INLINE:
@@ -7162,7 +7155,7 @@ declspecs_add_scspec (struct c_declspecs
   if (n != csc_none && n == specs->storage_class)
     dupe = true;
   if (dupe)
-    error ("duplicate %qs", IDENTIFIER_POINTER (scspec));
+    error ("duplicate %qE", scspec);
   if (n != csc_none)
     {
       if (specs->storage_class != csc_none && n != specs->storage_class)
@@ -7174,8 +7167,7 @@ declspecs_add_scspec (struct c_declspecs
 	  specs->storage_class = n;
 	  if (n != csc_extern && n != csc_static && specs->thread_p)
 	    {
-	      error ("%<__thread%> used with %qs",
-		     IDENTIFIER_POINTER (scspec));
+	      error ("%<__thread%> used with %qE", scspec);
 	      specs->thread_p = false;
 	    }
 	}
diff -rupN GCC.orig/gcc/c-format.c GCC/gcc/c-format.c
--- GCC.orig/gcc/c-format.c	2005-02-01 22:40:59.000000000 +0000
+++ GCC/gcc/c-format.c	2005-03-18 00:18:28.000000000 +0000
@@ -199,7 +199,8 @@ decode_format_attr (tree args, function_
       if (info->format_type == format_type_error)
 	{
 	  gcc_assert (!validated_p);
-	  warning ("%qs is an unrecognized format function type", p);
+	  warning ("%qE is an unrecognized format function type",
+		   format_type_id);
 	  return false;
 	}
     }
diff -rupN GCC.orig/gcc/c-typeck.c GCC/gcc/c-typeck.c
--- GCC.orig/gcc/c-typeck.c	2005-03-11 00:37:11.000000000 +0000
+++ GCC/gcc/c-typeck.c	2005-03-18 00:22:10.000000000 +0000
@@ -136,8 +136,7 @@ c_incomplete_type_error (tree value, tre
 
   if (value != 0 && (TREE_CODE (value) == VAR_DECL
 		     || TREE_CODE (value) == PARM_DECL))
-    error ("%qs has an incomplete type",
-	   IDENTIFIER_POINTER (DECL_NAME (value)));
+    error ("%qD has an incomplete type", value);
   else
     {
     retry:
@@ -180,12 +179,11 @@ c_incomplete_type_error (tree value, tre
 	}
 
       if (TREE_CODE (TYPE_NAME (type)) == IDENTIFIER_NODE)
-	error ("invalid use of undefined type %<%s %s%>",
-	       type_code_string, IDENTIFIER_POINTER (TYPE_NAME (type)));
+	error ("invalid use of undefined type %<%s %E%>",
+	       type_code_string, TYPE_NAME (type));
       else
 	/* If this type has a typedef-name, the TYPE_NAME is a TYPE_DECL.  */
-	error ("invalid use of incomplete typedef %qs",
-	       IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type))));
+	error ("invalid use of incomplete typedef %qD", TYPE_NAME (type));
     }
 }
 
@@ -1556,8 +1554,7 @@ build_component_ref (tree datum, tree co
 
       if (!field)
 	{
-	  error ("%qT has no member named %qs", type,
-		 IDENTIFIER_POINTER (component));
+	  error ("%qT has no member named %qE", type, component);
 	  return error_mark_node;
 	}
 
@@ -1592,8 +1589,8 @@ build_component_ref (tree datum, tree co
       return ref;
     }
   else if (code != ERROR_MARK)
-    error ("request for member %qs in something not a structure or union",
-	    IDENTIFIER_POINTER (component));
+    error ("request for member %qE in something not a structure or union",
+	   component);
 
   return error_mark_node;
 }
@@ -2811,16 +2808,16 @@ readonly_error (tree arg, enum lvalue_us
       if (TYPE_READONLY (TREE_TYPE (TREE_OPERAND (arg, 0))))
 	readonly_error (TREE_OPERAND (arg, 0), use);
       else
-	error (READONLY_MSG (N_("assignment of read-only member %qs"),
-			     N_("increment of read-only member %qs"),
-			     N_("decrement of read-only member %qs")),
-	       IDENTIFIER_POINTER (DECL_NAME (TREE_OPERAND (arg, 1))));
+	error (READONLY_MSG (N_("assignment of read-only member %qD"),
+			     N_("increment of read-only member %qD"),
+			     N_("decrement of read-only member %qD")),
+	       TREE_OPERAND (arg, 1));
     }
   else if (TREE_CODE (arg) == VAR_DECL)
-    error (READONLY_MSG (N_("assignment of read-only variable %qs"),
-			 N_("increment of read-only variable %qs"),
-			 N_("decrement of read-only variable %qs")),
-	   IDENTIFIER_POINTER (DECL_NAME (arg)));
+    error (READONLY_MSG (N_("assignment of read-only variable %qD"),
+			 N_("increment of read-only variable %qD"),
+			 N_("decrement of read-only variable %qD")),
+	   arg);
   else
     error (READONLY_MSG (N_("assignment of read-only location"),
 			 N_("increment of read-only location"),
@@ -5293,8 +5290,7 @@ set_init_label (tree fieldname)
     }
 
   if (tail == 0)
-    error ("unknown field %qs specified in initializer",
-	   IDENTIFIER_POINTER (fieldname));
+    error ("unknown field %qE specified in initializer", fieldname);
   else
     {
       constructor_fields = tail;



More information about the Gcc-patches mailing list