public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Jason Merrill <jason@redhat.com>
To: Jakub Jelinek <jakub@redhat.com>
Cc: gcc-patches@gcc.gnu.org
Subject: Re: [PATCH v2] c++: Accept C++11 attribute-definition [PR101582]
Date: Thu, 29 Jul 2021 15:03:50 -0400	[thread overview]
Message-ID: <47c6f2af-3c15-d013-177c-67f41f0224cf@redhat.com> (raw)
In-Reply-To: <20210729092825.GY2380545@tucnak>

On 7/29/21 5:28 AM, Jakub Jelinek wrote:
> On Wed, Jul 28, 2021 at 04:32:08PM -0400, Jason Merrill wrote:
>>> As the following testcase shows, we don't parse properly
>>> C++11 attribute-declaration:
>>> https://eel.is/c++draft/dcl.dcl#nt:attribute-declaration
>>>
>>> cp_parser_toplevel_declaration just handles empty-declaration parsing
>>> (with diagnostics for C++98)
>>
>> This seems to be a bug: from the comments, cp_parser_toplevel_declaration is
>> intended to only handle #pragma parsing, everything else should be in
>> cp_parser_declaration.
>>
>> As a result, we wrongly reject
>>
>> extern "C" ;
>>
>> So please move empty-declaration and attribute-declaration handling into
>> cp_parser_declaration.
> 
> So like this?
> It means we allow for modules
> export ;
> or
> export [[]];
> where we previously rejected those, which is allowed by the grammar and
> invalid because of
> https://eel.is/c++draft/module.interface#3
> but we allowed already before
> export {}
> which suffers from the same problem - the export-declaration doesn't declare
> at least one name.  So I think there just should be something that tracks if
> the module exported at least one name and if not, diagnose it at the end of
> cp_parser_module_export (and adjust the new modules testcase).
> 
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
> 
> 2021-07-29  Jakub Jelinek  <jakub@redhat.com>
> 
> 	PR c++/101582
> 	* parser.c (cp_parser_skip_std_attribute_spec_seq): Add a forward
> 	declaration.
> 	(cp_parser_declaration): Parse empty-declaration and
> 	attribute-declaration.
> 	(cp_parser_toplevel_declaration): Don't parse empty-declaration here.
> 
> 	* g++.dg/cpp0x/gen-attrs-45.C: Expect a warning about ignored
> 	attributes instead of error.
> 	* g++.dg/cpp0x/gen-attrs-75.C: New test.
> 	* g++.dg/modules/pr101582-1.C: New test.
> 
> --- gcc/cp/parser.c.jj	2021-07-28 23:06:38.658443554 +0200
> +++ gcc/cp/parser.c	2021-07-28 23:12:10.955941089 +0200
> @@ -2507,6 +2507,8 @@ static tree cp_parser_std_attribute_spec
>     (cp_parser *);
>   static tree cp_parser_std_attribute_spec_seq
>     (cp_parser *);
> +static size_t cp_parser_skip_std_attribute_spec_seq
> +  (cp_parser *, size_t);
>   static size_t cp_parser_skip_attributes_opt
>     (cp_parser *, size_t);
>   static bool cp_parser_extension_opt
> @@ -14410,6 +14412,31 @@ cp_parser_declaration (cp_parser* parser
>     cp_token *token2 = (token1->type == CPP_EOF
>   		      ? token1 : cp_lexer_peek_nth_token (parser->lexer, 2));
>   
> +  if (token1->type == CPP_SEMICOLON)
> +    {
> +      cp_lexer_consume_token (parser->lexer);
> +      /* A declaration consisting of a single semicolon is invalid
> +       * before C++11.  Allow it unless we're being pedantic.  */
> +      if (cxx_dialect < cxx11)
> +	pedwarn (input_location, OPT_Wpedantic, "extra %<;%>");
> +      return;
> +    }
> +  else if (cp_lexer_nth_token_is (parser->lexer,
> +				  cp_parser_skip_std_attribute_spec_seq (parser,
> +									 1),
> +				  CPP_SEMICOLON))
> +    {
> +      location_t attrs_loc = token1->location;
> +      tree std_attrs = cp_parser_std_attribute_spec_seq (parser);
> +      if (std_attrs != NULL_TREE)
> +	warning_at (make_location (attrs_loc, attrs_loc, parser->lexer),
> +		    OPT_Wattributes,
> +		    "attributes in attribute declaration are ignored");

Let's not mention the obscure attribute-declaration grammar nonterminal, 
"attribute ignored" seems sufficient.

> +      if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
> +	cp_lexer_consume_token (parser->lexer);
> +      return;
> +    }
> +
>     /* Get the high-water mark for the DECLARATOR_OBSTACK.  */
>     void *p = obstack_alloc (&declarator_obstack, 0);
>   
> @@ -14560,14 +14587,6 @@ cp_parser_toplevel_declaration (cp_parse
>          cp_parser_declaration.  (A #pragma at block scope is
>          handled in cp_parser_statement.)  */
>       cp_parser_pragma (parser, pragma_external, NULL);
> -  else if (token->type == CPP_SEMICOLON)
> -    {
> -      cp_lexer_consume_token (parser->lexer);
> -      /* A declaration consisting of a single semicolon is invalid
> -       * before C++11.  Allow it unless we're being pedantic.  */
> -      if (cxx_dialect < cxx11)
> -	pedwarn (input_location, OPT_Wpedantic, "extra %<;%>");
> -    }
>     else
>       /* Parse the declaration itself.  */
>       cp_parser_declaration (parser, NULL_TREE);
> --- gcc/testsuite/g++.dg/cpp0x/gen-attrs-45.C.jj	2021-07-26 09:13:08.504121494 +0200
> +++ gcc/testsuite/g++.dg/cpp0x/gen-attrs-45.C	2021-07-28 23:07:05.095085351 +0200
> @@ -1,4 +1,4 @@
>   // PR c++/52906
>   // { dg-do compile { target c++11 } }
>   
> -[[gnu::deprecated]]; // { dg-error "does not declare anything" }
> +[[gnu::deprecated]]; // { dg-warning "attributes in attribute declaration are ignored" }
> --- gcc/testsuite/g++.dg/cpp0x/gen-attrs-75.C.jj	2021-07-28 23:07:05.095085351 +0200
> +++ gcc/testsuite/g++.dg/cpp0x/gen-attrs-75.C	2021-07-29 10:59:09.630326797 +0200
> @@ -0,0 +1,35 @@
> +// PR c++/101582
> +// { dg-do compile }
> +// { dg-options "" }
> +
> +;
> +[[]] [[]] [[]];	// { dg-warning "attributes only available with" "" { target c++98_only } }
> +[[foobar]];	// { dg-warning "attributes in attribute declaration are ignored" }
> +// { dg-warning "attributes only available with" "" { target c++98_only } .-1 }
> +
> +extern "C" ;
> +extern "C" [[]];	// { dg-warning "attributes only available with" "" { target c++98_only } }
> +extern "C" extern "C" ;
> +extern "C" extern "C" [[]][[]][[]];	// { dg-warning "attributes only available with" "" { target c++98_only } }
> +__extension__ ;
> +__extension__ [[]];			// { dg-warning "attributes only available with" "" { target c++98_only } }
> +__extension__ __extension__ ;
> +__extension__ __extension__ [[]][[]];	// { dg-warning "attributes only available with" "" { target c++98_only } }
> +
> +namespace N {
> +
> +;
> +[[]] [[]] [[]];	// { dg-warning "attributes only available with" "" { target c++98_only } }
> +[[foobar]];	// { dg-warning "attributes in attribute declaration are ignored" }
> +// { dg-warning "attributes only available with" "" { target c++98_only } .-1 }
> +
> +extern "C" ;
> +extern "C" [[]];	// { dg-warning "attributes only available with" "" { target c++98_only } }
> +extern "C" extern "C" ;
> +extern "C" extern "C" [[]][[]][[]];	// { dg-warning "attributes only available with" "" { target c++98_only } }
> +__extension__ ;
> +__extension__ [[]];			// { dg-warning "attributes only available with" "" { target c++98_only } }
> +__extension__ __extension__ ;
> +__extension__ __extension__ [[]][[]];	// { dg-warning "attributes only available with" "" { target c++98_only } }
> +
> +}
> --- gcc/testsuite/g++.dg/modules/pr101582-1.C.jj	2021-07-29 11:07:17.567662550 +0200
> +++ gcc/testsuite/g++.dg/modules/pr101582-1.C	2021-07-29 11:08:02.297051638 +0200
> @@ -0,0 +1,9 @@
> +// PR c++/101582
> +// { dg-additional-options "-fmodules-ts" }
> +export module pr101582;
> +// { dg-module-cmi "pr101582" }
> +export ;
> +export [[]];
> +export
> +{
> +}

These should have xfailed dg-errors.

OK with those changes.

Jason


  reply	other threads:[~2021-07-29 19:03 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-07-23  8:03 [PATCH] " Jakub Jelinek
2021-07-28 20:32 ` Jason Merrill
2021-07-29  9:28   ` [PATCH v2] " Jakub Jelinek
2021-07-29 19:03     ` Jason Merrill [this message]
2021-07-30  8:56       ` Jakub Jelinek

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=47c6f2af-3c15-d013-177c-67f41f0224cf@redhat.com \
    --to=jason@redhat.com \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=jakub@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).