From patchwork Tue Jun 22 07:05:48 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Shujing Zhao X-Patchwork-Id: 56403 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 B6090B6EE8 for ; Tue, 22 Jun 2010 17:08:05 +1000 (EST) Received: (qmail 26650 invoked by alias); 22 Jun 2010 07:08:02 -0000 Received: (qmail 26593 invoked by uid 22791); 22 Jun 2010 07:08:00 -0000 X-SWARE-Spam-Status: No, hits=-1.8 required=5.0 tests=AWL, BAYES_00, TW_BJ, 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; Tue, 22 Jun 2010 07:07:55 +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 o5M77hTG028375 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 22 Jun 2010 07:07:45 GMT Received: from acsmt354.oracle.com (acsmt354.oracle.com [141.146.40.154]) by acsinet15.oracle.com (Switch-3.4.2/Switch-3.4.1) with ESMTP id o5M5YBov030655; Tue, 22 Jun 2010 07:07:41 GMT Received: from abhmt013.oracle.com by acsmt353.oracle.com with ESMTP id 362623371277190347; Tue, 22 Jun 2010 00:05:47 -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 ; Tue, 22 Jun 2010 00:05:46 -0700 Message-ID: <4C2060CC.3040401@oracle.com> Date: Tue, 22 Jun 2010 15:05:48 +0800 From: Shujing Zhao User-Agent: Thunderbird 2.0.0.24 (X11/20100228) MIME-Version: 1.0 To: GCC Patches CC: "Joseph S. Myers" , =?ISO-8859-1?Q?Manuel_?= =?ISO-8859-1?Q?L=F3pez-Ib=E1=F1ez?= , Paolo Carlini Subject: [PATCH C] Fix pr44517 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 Hi, This patch tries to improve diagnostic for wrong type name in function declaration. It also changes the algorithm of function c_parser_parms_list_declarator. If one of parameter declaration is wrong, c_parser_parms_list_declarator would return NULL, not an empty parameter information struct. A test case is added to test this change. Bootstrapped and tested on i686-pc-linux-gnu with enabled c, objc and c++. Is it ok? Thanks Pearly gcc/ 2010-06-21 Shujing Zhao PR c/44517 * c-parser.c (c_parser_parms_list_declarator): Return NULL if the parameters are not good. (c_parser_parameter_declaration): Error unknown type name if the parameter can't start declaration specifiers. gcc/testsuite/ 2010-06-22 Shujing Zhao PR c/44517 * gcc.dg/pr44517.c: New. * gcc.dg/noncompile/990416-1.c: Adjust expected error. Index: c-parser.c =================================================================== --- c-parser.c (revision 160889) +++ c-parser.c (working copy) @@ -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 good_parm = true; /* ??? 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) + good_parm = false; + else + push_parm_decl (parm); if (c_parser_next_token_is (parser, CPP_SEMICOLON)) { tree new_attrs; @@ -2777,17 +2776,7 @@ c_parser_parms_list_declarator (c_parser if (good_parm) return get_parm_info (false); else - { - 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; - } + return NULL; } if (!c_parser_require (parser, CPP_COMMA, "expected %<;%>, %<,%> or %<)%>")) @@ -2805,17 +2794,7 @@ c_parser_parms_list_declarator (c_parser if (good_parm) return get_parm_info (true); else - { - 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; - } + return false; } else { @@ -2843,8 +2822,12 @@ c_parser_parameter_declaration (c_parser { /* ??? In some Objective-C cases '...' isn't applicable so there should be a different message. */ - c_parser_error (parser, - "expected declaration specifiers or %<...%>"); + c_token *token = c_parser_peek_token (parser); + if (parser->error) + return NULL; + parser->error = true; + c_parser_set_source_position_from_token (token); + error ("unknown type name %qE", token->value); c_parser_skip_to_end_of_parameter (parser); return NULL; } Index: testsuite/gcc.dg/pr44517.c =================================================================== --- testsuite/gcc.dg/pr44517.c (revision 0) +++ testsuite/gcc.dg/pr44517.c (revision 0) @@ -0,0 +1,10 @@ +/* PR c/44517 */ +/* { dg-do compile } */ +/* { dg-options "" } */ +int foo(int x, pid_t y, long z, in t) { /* { dg-error "unknown type name.*pid_t|unknown type name.*in" } */ + return x + y + z + t; +} + +int bar(int x, lon y, long z, ...){ /* { dg-error "unknown type name" } */ + return; +} Index: testsuite/gcc.dg/noncompile/990416-1.c =================================================================== --- testsuite/gcc.dg/noncompile/990416-1.c (revision 160889) +++ testsuite/gcc.dg/noncompile/990416-1.c (working copy) @@ -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)); }