From patchwork Fri Jun 25 08:01:17 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Shujing Zhao X-Patchwork-Id: 56892 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) by ozlabs.org (Postfix) with SMTP id F0E50B6EFE for ; Fri, 25 Jun 2010 18:01:36 +1000 (EST) Received: (qmail 27493 invoked by alias); 25 Jun 2010 08:01:34 -0000 Received: (qmail 26805 invoked by uid 22791); 25 Jun 2010 08:01:32 -0000 X-SWARE-Spam-Status: No, hits=-1.8 required=5.0 tests=AWL, BAYES_00, TW_CP, T_RP_MATCHES_RCVD, UNPARSEABLE_RELAY X-Spam-Check-By: sourceware.org Received: from rcsinet10.oracle.com (HELO rcsinet10.oracle.com) (148.87.113.121) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Fri, 25 Jun 2010 08:01:25 +0000 Received: from acsinet15.oracle.com (acsinet15.oracle.com [141.146.126.227]) by rcsinet10.oracle.com (Switch-3.4.2/Switch-3.4.2) with ESMTP id o5P81LpC008355 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 25 Jun 2010 08:01:23 GMT Received: from acsmt353.oracle.com (acsmt353.oracle.com [141.146.40.153]) by acsinet15.oracle.com (Switch-3.4.2/Switch-3.4.1) with ESMTP id o5P5qFpC010212; Fri, 25 Jun 2010 08:01:20 GMT Received: from abhmt006.oracle.com by acsmt355.oracle.com with ESMTP id 356296891277452879; Fri, 25 Jun 2010 01:01:19 -0700 Received: from dhcp-beijing-cdc-10-182-121-28.cn.oracle.com (/10.182.121.28) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 25 Jun 2010 01:01:18 -0700 Message-ID: <4C24624D.3060105@oracle.com> Date: Fri, 25 Jun 2010 16:01:17 +0800 From: Shujing Zhao User-Agent: Thunderbird 2.0.0.24 (X11/20100228) MIME-Version: 1.0 To: "Joseph S. Myers" CC: =?ISO-8859-1?Q?Manuel_L=F3pez-Ib=E1=F1ez?= , GCC Patches , Paolo Carlini Subject: Re: [PATCH C] Fix pr44517 References: <4C2060CC.3040401@oracle.com> <4C21C7EE.4060805@oracle.com> <4C232325.2020107@oracle.com> In-Reply-To: X-IsSubscribed: yes Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org 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 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 + + PR c/44517 + * gcc.dg/noncompile/pr44517.c: New. + * gcc.dg/noncompile/990416-1.c: Adjust expected error. + 2010-06-24 Steve Ellcey PR testsuite/43283 Index: ChangeLog =================================================================== --- ChangeLog (revision 161362) +++ ChangeLog (revision 161363) @@ -1,3 +1,11 @@ +2010-06-25 Shujing Zhao + + 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 * 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; }