Patchwork [C] Fix pr44517

login
register
mail settings
Submitter Shujing Zhao
Date June 25, 2010, 8:01 a.m.
Message ID <4C24624D.3060105@oracle.com>
Download mbox | patch
Permalink /patch/56892/
State New
Headers show

Comments

Shujing Zhao - June 25, 2010, 8:01 a.m.
On 06/24/2010 07:20 PM, Joseph S. Myers wrote:
  > Rather than saying the old message is more appropriate, I'd say that you
> can't really tell the difference between (int, pid_t) where a type was 
> undeclared and (int a, b) where a type name is needed before "b".  So 
> perhaps the messages should say that either a type is undeclared or a type 
> is missing before a parameter name.  (Actually, I'd guess that almost all 
> function prototypes either name all parameters or no parameters, so in the 
> first case it's a very good guess that pid_t is a type and in the second 
> it's a very good guess that b is a parameter name.  But that's definitely 
> an enhancement for the future.)
> 
> The patch is OK without further code changes needed but with one testcase 
> fix:
> 
>> +int f1(int x, pid_t y, long z, in t) {  /* { dg-error "unknown type name 'pid_t'|unknown type name 'in'" } */
> 
> Please use two separate dg-error directives to match the two separate 
> error messages.  The second one would use the form with a line number, { 
> dg-error "message" "test name" { target *-*-* } line-number }.
> 

Thanks. Committed to trunk.

Pearly

Patch

Index: testsuite/gcc.dg/noncompile/pr44517.c
===================================================================
--- testsuite/gcc.dg/noncompile/pr44517.c	(revision 0)
+++ testsuite/gcc.dg/noncompile/pr44517.c	(revision 161363)
@@ -0,0 +1,18 @@ 
+/* PR c/44517: Improve diagnostic for misspelled typename in function declaration. */
+int f1(int x, pid_t y, long z, in t) {
+/* { dg-error "unknown type name 'pid_t'" "" { target *-*-* } 2 } */
+/* { dg-error "unknown type name 'in'" "" { target *-*-* } 2 } */
+  return x + y + z + t;
+}
+
+int f2(int x, lon y, long z, ...){ /* { dg-error "unknown type name 'lon'" } */
+  return;
+}
+
+void f3(int n, int a[n], pid_t x); /* { dg-error "unknown type name 'pid_t'" } */
+void f4() {}
+void f5(int a, *b); /* { dg-error "expected declaration specifiers or" } */
+void f6(int a, b);  /* { dg-error "expected declaration specifiers or" } */
+void f7(int a, goto b); /* { dg-error "expected declaration specifiers or" } */
+void f8(int a, in goto); /* { dg-error "unknown type name 'in'" } */
+void f9(int a, in 1); /* { dg-error "unknown type name 'in'" } */
Index: testsuite/gcc.dg/noncompile/990416-1.c
===================================================================
--- testsuite/gcc.dg/noncompile/990416-1.c	(revision 161362)
+++ testsuite/gcc.dg/noncompile/990416-1.c	(revision 161363)
@@ -2,11 +2,11 @@  extern void *memcpy (void *, const void 
 typedef int word_type;
    
 static void
-copy_reg (unsigned int reg, frame_state *udata,	/* { dg-error "parse|syntax|expected" } */
-	  frame_state *target_udata)	/* { dg-error "expected" } */
+copy_reg (unsigned int reg, frame_state *udata,	/* { dg-error "unknown type name" } */
+	  frame_state *target_udata)	/* { dg-error "unknown type name" } */
 {  
-  word_type *preg = get_reg_addr (reg, udata, 0);	/* { dg-error "undeclared|function|without a cast" } */
-  word_type *ptreg = get_reg_addr (reg, target_udata, 0); /* { dg-error "undeclared|without a cast" } */
+  word_type *preg = ge_reg_addr (reg, udata, 0);
+  word_type *ptreg = ge_reg_addr (reg, target_udata, 0);
    
   memcpy (ptreg, preg, __builtin_dwarf_reg_size (reg));
 }
Index: testsuite/ChangeLog
===================================================================
--- testsuite/ChangeLog	(revision 161362)
+++ testsuite/ChangeLog	(revision 161363)
@@ -1,3 +1,9 @@ 
+2010-06-25  Shujing Zhao  <pearly.zhao@oracle.com>
+
+	PR c/44517
+	* gcc.dg/noncompile/pr44517.c: New.
+	* gcc.dg/noncompile/990416-1.c: Adjust expected error.
+
 2010-06-24  Steve Ellcey  <sje@cup.hp.com>
 
 	PR testsuite/43283
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 161362)
+++ ChangeLog	(revision 161363)
@@ -1,3 +1,11 @@ 
+2010-06-25  Shujing Zhao  <pearly.zhao@oracle.com>
+
+	PR c/44517
+	* c-parser.c (c_parser_parms_list_declarator): Return NULL if one of
+	parameters are not good.
+	(c_parser_parameter_declaration): Error unknown type name if the type
+	name can't start declaration specifiers.
+
 2010-06-25  Joseph Myers  <joseph@codesourcery.com>
 
 	* gcc.c (translate_options): Don't mention +e in comment.
Index: c-parser.c
===================================================================
--- c-parser.c	(revision 161362)
+++ c-parser.c	(revision 161363)
@@ -2706,7 +2706,7 @@  c_parser_parms_declarator (c_parser *par
 static struct c_arg_info *
 c_parser_parms_list_declarator (c_parser *parser, tree attrs)
 {
-  bool good_parm = false;
+  bool bad_parm = false;
   /* ??? Following the old parser, forward parameter declarations may
      use abstract declarators, and if no real parameter declarations
      follow the forward declarations then this is not diagnosed.  Also
@@ -2758,11 +2758,10 @@  c_parser_parms_list_declarator (c_parser
       /* Parse a parameter.  */
       struct c_parm *parm = c_parser_parameter_declaration (parser, attrs);
       attrs = NULL_TREE;
-      if (parm != NULL)
-	{
-	  good_parm = true;
-	  push_parm_decl (parm);
-	}
+      if (parm == NULL)
+	bad_parm = true;
+      else
+	push_parm_decl (parm);
       if (c_parser_next_token_is (parser, CPP_SEMICOLON))
 	{
 	  tree new_attrs;
@@ -2774,20 +2773,13 @@  c_parser_parms_list_declarator (c_parser
       if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
 	{
 	  c_parser_consume_token (parser);
-	  if (good_parm)
-	    return get_parm_info (false);
-	  else
+	  if (bad_parm)
 	    {
-	      struct c_arg_info *ret
-		= XOBNEW (&parser_obstack, struct c_arg_info);
-	      ret->parms = 0;
-	      ret->tags = 0;
-	      ret->types = 0;
-	      ret->others = 0;
-	      ret->pending_sizes = 0;
-	      ret->had_vla_unspec = 0;
-	      return ret;
+	      get_pending_sizes ();
+	      return NULL;
 	    }
+	  else
+	    return get_parm_info (false);
 	}
       if (!c_parser_require (parser, CPP_COMMA,
 			     "expected %<;%>, %<,%> or %<)%>"))
@@ -2802,20 +2794,13 @@  c_parser_parms_list_declarator (c_parser
 	  if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
 	    {
 	      c_parser_consume_token (parser);
-	      if (good_parm)
-		return get_parm_info (true);
-	      else
+	      if (bad_parm)
 		{
-		  struct c_arg_info *ret
-		    = XOBNEW (&parser_obstack, struct c_arg_info);
-		  ret->parms = 0;
-		  ret->tags = 0;
-		  ret->types = 0;
-		  ret->others = 0;
-		  ret->pending_sizes = 0;
-		  ret->had_vla_unspec = 0;
-		  return ret;
+		  get_pending_sizes ();
+		  return NULL;
 		}
+	      else
+		return get_parm_info (true);
 	    }
 	  else
 	    {
@@ -2841,10 +2826,22 @@  c_parser_parameter_declaration (c_parser
   bool dummy = false;
   if (!c_parser_next_token_starts_declspecs (parser))
     {
+      c_token *token = c_parser_peek_token (parser);
+      if (parser->error)
+	return NULL;
+      c_parser_set_source_position_from_token (token);
+      if (token->type == CPP_NAME
+	  && c_parser_peek_2nd_token (parser)->type != CPP_COMMA
+	  && c_parser_peek_2nd_token (parser)->type != CPP_CLOSE_PAREN)
+	{
+	  error ("unknown type name %qE", token->value);
+	  parser->error = true;
+	}
       /* ??? In some Objective-C cases '...' isn't applicable so there
 	 should be a different message.  */
-      c_parser_error (parser,
-		      "expected declaration specifiers or %<...%>");
+      else
+	c_parser_error (parser,
+			"expected declaration specifiers or %<...%>");
       c_parser_skip_to_end_of_parameter (parser);
       return NULL;
     }