From patchwork Fri Oct 7 09:44:02 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tristan Gingold X-Patchwork-Id: 118288 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 D054CB70D1 for ; Fri, 7 Oct 2011 20:44:32 +1100 (EST) Received: (qmail 16895 invoked by alias); 7 Oct 2011 09:44:30 -0000 Received: (qmail 16882 invoked by uid 22791); 7 Oct 2011 09:44:29 -0000 X-SWARE-Spam-Status: No, hits=-1.8 required=5.0 tests=AWL,BAYES_00 X-Spam-Check-By: sourceware.org Received: from mel.act-europe.fr (HELO mel.act-europe.fr) (194.98.77.210) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Fri, 07 Oct 2011 09:44:14 +0000 Received: from localhost (localhost [127.0.0.1]) by filtered-smtp.eu.adacore.com (Postfix) with ESMTP id 38AE8CB0374; Fri, 7 Oct 2011 11:44:14 +0200 (CEST) Received: from mel.act-europe.fr ([127.0.0.1]) by localhost (smtp.eu.adacore.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id LZVG6Bso7I7O; Fri, 7 Oct 2011 11:44:03 +0200 (CEST) Received: from ulanbator.act-europe.fr (ulanbator.act-europe.fr [10.10.1.67]) (using TLSv1 with cipher AES128-SHA (128/128 bits)) (No client certificate requested) by mel.act-europe.fr (Postfix) with ESMTP id DAFC0CB02DC; Fri, 7 Oct 2011 11:44:03 +0200 (CEST) Subject: Re: [Patch] Support DEC-C extensions Mime-Version: 1.0 (Apple Message framework v1244.3) From: Tristan Gingold In-Reply-To: Date: Fri, 7 Oct 2011 11:44:02 +0200 Cc: GCC Patches Message-Id: <86BF0CA4-502F-4C53-8658-4666CF3F2C14@adacore.com> References: <51227D85-9E15-48AB-9381-14B597C1F80B@adacore.com> <07CC04EB-8EFF-4875-BA8B-D630026AE744@adacore.com> <4E8A0AB4.5000907@gnat.com> <30095EEF-CE40-453E-9E28-E1BD10D4573F@adacore.com> To: Joseph S. Myers 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 Oct 6, 2011, at 4:12 PM, Joseph S. Myers wrote: > On Thu, 6 Oct 2011, Tristan Gingold wrote: > >> So the consensus is for a dedicated option. Which one do you prefer ? >> >> -funnamed-variadic-parameter >> -fpointless-variadic-functions >> -fallow-parameterless-variadic-functions > > I prefer -fallow-parameterless-variadic-functions. Here is my patch with the option renamed. Ok for trunk ? Bootstrapped on x86_64/Darwin, va-arg retested. Tristan. 2011-09-29 Tristan Gingold * doc/invoke.texi: Document -fallow-parameterless-variadic-functions. * c-parser.c (c_parser_parms_list_declarator): Handle it. gcc/c-family/ChangeLog 2011-09-29 Tristan Gingold * c.opt (fallow-parameterless-variadic-functions): New. gcc/testsuite/ChangeLog 2011-09-29 Tristan Gingold * gcc.dg/va-arg-4.c: New test. * gcc.dg/va-arg-5.c: Ditto. diff --git a/gcc/c-family/c.opt b/gcc/c-family/c.opt index e6ac5dc..79287c4 100644 --- a/gcc/c-family/c.opt +++ b/gcc/c-family/c.opt @@ -700,6 +700,10 @@ Enforce class member access control semantics fall-virtual C++ ObjC++ Ignore Warn(switch %qs is no longer supported) +fallow-parameterless-variadic-functions +C ObjC Var(flag_allow_parameterless_variadic_functions) +Allow variadic functions without named parameter + falt-external-templates C++ ObjC++ Ignore Warn(switch %qs is no longer supported) No longer supported diff --git a/gcc/c-parser.c b/gcc/c-parser.c index ff376df..0ca0f04 100644 --- a/gcc/c-parser.c +++ b/gcc/c-parser.c @@ -3159,10 +3159,19 @@ c_parser_parms_list_declarator (c_parser *parser, tree attrs, tree expr) if (c_parser_next_token_is (parser, CPP_ELLIPSIS)) { struct c_arg_info *ret = build_arg_info (); - /* Suppress -Wold-style-definition for this case. */ - ret->types = error_mark_node; - error_at (c_parser_peek_token (parser)->location, - "ISO C requires a named argument before %<...%>"); + + if (flag_allow_parameterless_variadic_functions) + { + /* F (...) is allowed. */ + ret->types = NULL_TREE; + } + else + { + /* Suppress -Wold-style-definition for this case. */ + ret->types = error_mark_node; + error_at (c_parser_peek_token (parser)->location, + "ISO C requires a named argument before %<...%>"); + } c_parser_consume_token (parser); if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN)) { diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index e166964..d42af1d 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -170,7 +170,7 @@ in the following sections. @item C Language Options @xref{C Dialect Options,,Options Controlling C Dialect}. @gccoptlist{-ansi -std=@var{standard} -fgnu89-inline @gol --aux-info @var{filename} @gol +-aux-info @var{filename} -fallow-parameterless-variadic-functions @gol -fno-asm -fno-builtin -fno-builtin-@var{function} @gol -fhosted -ffreestanding -fopenmp -fms-extensions -fplan9-extensions @gol -trigraphs -no-integrated-cpp -traditional -traditional-cpp @gol @@ -1618,6 +1618,13 @@ character). In the case of function definitions, a K&R-style list of arguments followed by their declarations is also provided, inside comments, after the declaration. +@item -fallow-parameterless-variadic-functions +Accept variadic functions without named parameters. + +Although it is possible to define such a function, this is not very +usefull as it is not possible to read the arguments. This is only +supported for C as this construct is allowed by C++. + @item -fno-asm @opindex fno-asm Do not recognize @code{asm}, @code{inline} or @code{typeof} as a diff --git a/gcc/testsuite/gcc.dg/va-arg-4.c b/gcc/testsuite/gcc.dg/va-arg-4.c new file mode 100644 index 0000000..6d737c4 --- /dev/null +++ b/gcc/testsuite/gcc.dg/va-arg-4.c @@ -0,0 +1,3 @@ +/* { dg-do compile } */ +#include +extern void baz(...); /* { dg-error "requires a named argument" } */ diff --git a/gcc/testsuite/gcc.dg/va-arg-5.c b/gcc/testsuite/gcc.dg/va-arg-5.c new file mode 100644 index 0000000..a00616e --- /dev/null +++ b/gcc/testsuite/gcc.dg/va-arg-5.c @@ -0,0 +1,4 @@ +/* { dg-do compile } */ +/* { dg-options "-fallow-parameterless-variadic-functions" } */ +#include +extern void baz(...);