Re: [PATCH] Fix parser to recognize operator?:
On 10/14/19 11:27 AM, Matthias Kretz wrote: This time with testcase. Is the subdir for the test ok? Yes. gcc/ChangeLog: 2019-10-11 Matthias Kretz * gcc/cp/parser.c (cp_parser_operator): Parse operator?: as an attempt to overload the conditional operator. Then grok_op_properties can print its useful "ISO C++ prohibits overloading operator ?:" message instead of the cryptic error message about a missing type-specifier before '?' token. The first sentence is enough for a ChangeLog; the second should be an explanatory comment above the ChangeLog entries. Also, this entry belongs in gcc/cp/ChangeLog. +++ b/gcc/cp/parser.c @@ -15502,6 +15502,15 @@ cp_parser_operator (cp_parser* parser, location_t start_loc) Word wrap broke the patch here. Feel free to send patches as attachments if it's hard to suppress word wrap in your mailer (as it is in mine). I also saw an additional failure in the testsuite: > FAIL: g++.old-deja/g++.jason/operator.C -std=gnu++2a (test for errors, line 8) > FAIL: g++.old-deja/g++.jason/operator.C -std=gnu++2a (test for excess errors) Here's what I'm applying: Jason commit c3e97f573b6e29324ef72ded63e0307cec8d2ce2 Author: Jason Merrill Date: Tue Nov 5 17:31:44 2019 + Fix parser to recognize operator?: This change lets grok_op_properties print its useful "ISO C++ prohibits overloading operator ?:" message instead of the cryptic error message about a missing type-specifier before '?' token. 2019-11-06 Matthias Kretz * parser.c (cp_parser_operator): Parse operator?: as an attempt to overload the conditional operator. diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index cbbf946d32c..b17e0336e1c 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -15542,6 +15542,15 @@ cp_parser_operator (cp_parser* parser, location_t start_loc) op = COMPONENT_REF; break; +case CPP_QUERY: + op = COND_EXPR; + /* Consume the `?'. */ + cp_lexer_consume_token (parser->lexer); + /* Look for the matching `:'. */ + cp_parser_require (parser, CPP_COLON, RT_COLON); + consumed = true; + break; + case CPP_OPEN_PAREN: { /* Consume the `('. */ diff --git a/gcc/testsuite/g++.dg/parse/operator9.C b/gcc/testsuite/g++.dg/parse/operator9.C new file mode 100644 index 000..d66355afab5 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/operator9.C @@ -0,0 +1,5 @@ +// { dg-do compile } + +struct A {}; +struct B {}; +int operator?:(bool, A, B); // { dg-error "prohibits overloading" } diff --git a/gcc/testsuite/g++.old-deja/g++.jason/operator.C b/gcc/testsuite/g++.old-deja/g++.jason/operator.C index c2fc212cef0..69a41cf2448 100644 --- a/gcc/testsuite/g++.old-deja/g++.jason/operator.C +++ b/gcc/testsuite/g++.old-deja/g++.jason/operator.C @@ -5,7 +5,7 @@ typedef __SIZE_TYPE__ size_t; struct A { - int operator?:(int a, int b); // { dg-error "expected type-specifier" } + int operator?:(int a, int b); // { dg-error "prohibits overloading" } static int operator()(int a); // { dg-error "14:.static int A::operator\\(\\)\\(int\\). must be a nonstatic member function" } static int operator+(A,A); // { dg-error "14:.static int A::operator\\+\\(A, A\\). must be either a non-static member function or a non-member function" } int operator+(int a, int b = 1); // { dg-error "7:.int A::operator\\+\\(int, int\\). must have either zero or one argument" } diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index d0b47f7c562..e60a45b869e 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2019-11-06 Matthias Kretz + + * parser.c (cp_parser_operator): Parse operator?: as an + attempt to overload the conditional operator. + 2019-11-05 Jason Merrill Implement C++20 operator<=>.
Re: [PATCH] Fix parser to recognize operator?:
ping On Montag, 14. Oktober 2019 12:27:11 CEST Matthias Kretz wrote: > This time with testcase. Is the subdir for the test ok? > > gcc/ChangeLog: > > 2019-10-11 Matthias Kretz > > * gcc/cp/parser.c (cp_parser_operator): Parse operator?: as an > attempt to overload the conditional operator. Then > grok_op_properties can print its useful "ISO C++ prohibits > overloading operator ?:" message instead of the cryptic error > message about a missing type-specifier before '?' token. > > gcc/testsuite/ChangeLog: > > 2019-10-14 Matthias Kretz > * testsuite/g++.dg/parse/operator9.C: New test verifying the > correct error message is printed. > > diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c > index 3ee8da7db94..73385cb3dcb 100644 > --- a/gcc/cp/parser.c > +++ b/gcc/cp/parser.c > @@ -15502,6 +15502,15 @@ cp_parser_operator (cp_parser* parser, location_t > start_loc) >op = COMPONENT_REF; >break; > > +case CPP_QUERY: > + op = COND_EXPR; > + /* Consume the `?'. */ > + cp_lexer_consume_token (parser->lexer); > + /* Look for the matching `:'. */ > + cp_parser_require (parser, CPP_COLON, RT_COLON); > + consumed = true; > + break; > + > case CPP_OPEN_PAREN: >{ > /* Consume the `('. */ > diff --git a/gcc/testsuite/g++.dg/parse/operator9.C b/gcc/testsuite/g++.dg/ > parse/operator9.C > new file mode 100644 > index 000..d66355afab5 > --- /dev/null > +++ b/gcc/testsuite/g++.dg/parse/operator9.C > @@ -0,0 +1,5 @@ > +// { dg-do compile } > + > +struct A {}; > +struct B {}; > +int operator?:(bool, A, B); // { dg-error "prohibits overloading" } > > On Freitag, 11. Oktober 2019 16:17:09 CEST you wrote: > > On Fri, Oct 11, 2019 at 04:06:43PM +0200, Matthias Kretz wrote: > > > This is a minor bugfix for improved error reporting. Overloading ?: is > > > just as disallowed as it is without this change. > > > > Thanks. Can you provide a testcase that shows why this change makes > > sense? > > That testcase then should be part of the patch submission. -- ── Dr. Matthias Kretz https://mattkretz.github.io GSI Helmholtzzentrum für Schwerionenforschung https://gsi.de SIMD easy and portable https://github.com/VcDevel/Vc ──
Re: [PATCH] Fix parser to recognize operator?:
This time with testcase. Is the subdir for the test ok? gcc/ChangeLog: 2019-10-11 Matthias Kretz * gcc/cp/parser.c (cp_parser_operator): Parse operator?: as an attempt to overload the conditional operator. Then grok_op_properties can print its useful "ISO C++ prohibits overloading operator ?:" message instead of the cryptic error message about a missing type-specifier before '?' token. gcc/testsuite/ChangeLog: 2019-10-14 Matthias Kretz * testsuite/g++.dg/parse/operator9.C: New test verifying the correct error message is printed. diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 3ee8da7db94..73385cb3dcb 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -15502,6 +15502,15 @@ cp_parser_operator (cp_parser* parser, location_t start_loc) op = COMPONENT_REF; break; +case CPP_QUERY: + op = COND_EXPR; + /* Consume the `?'. */ + cp_lexer_consume_token (parser->lexer); + /* Look for the matching `:'. */ + cp_parser_require (parser, CPP_COLON, RT_COLON); + consumed = true; + break; + case CPP_OPEN_PAREN: { /* Consume the `('. */ diff --git a/gcc/testsuite/g++.dg/parse/operator9.C b/gcc/testsuite/g++.dg/ parse/operator9.C new file mode 100644 index 000..d66355afab5 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/operator9.C @@ -0,0 +1,5 @@ +// { dg-do compile } + +struct A {}; +struct B {}; +int operator?:(bool, A, B); // { dg-error "prohibits overloading" } On Freitag, 11. Oktober 2019 16:17:09 CEST you wrote: > On Fri, Oct 11, 2019 at 04:06:43PM +0200, Matthias Kretz wrote: > > This is a minor bugfix for improved error reporting. Overloading ?: is > > just as disallowed as it is without this change. > > Thanks. Can you provide a testcase that shows why this change makes sense? > That testcase then should be part of the patch submission. -- ── Dr. Matthias Kretz https://mattkretz.github.io GSI Helmholtzzentrum für Schwerionenforschung https://gsi.de SIMD easy and portable https://github.com/VcDevel/Vc ──
Re: [PATCH] Fix parser to recognize operator?:
On Freitag, 11. Oktober 2019 16:17:09 CEST Marek Polacek wrote: > On Fri, Oct 11, 2019 at 04:06:43PM +0200, Matthias Kretz wrote: > > This is a minor bugfix for improved error reporting. Overloading ?: is > > just as disallowed as it is without this change. > > Thanks. Can you provide a testcase that shows why this change makes sense? > That testcase then should be part of the patch submission. I can. Most (all?) testcases reference a PR. Should I open one? > > > 2019-10-11 Matthias Kretz > > > > * gcc/cp/parser.c (cp_parser_operator): Parse operator?: as an > > > > attempt to overload the conditional operator. Then > > grok_op_properties can print its useful "ISO C++ prohibits > > overloading operator ?:" message instead of the cryptic error > > message about a missing type-specifier before '?' token. > > > > diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c > > index 3ee8da7db94..73385cb3dcb 100644 > > --- a/gcc/cp/parser.c > > +++ b/gcc/cp/parser.c > > @@ -15502,6 +15502,15 @@ cp_parser_operator (cp_parser* parser, location_t > > start_loc) > > > >op = COMPONENT_REF; > >break; > > > > +case CPP_QUERY: > > + op = COND_EXPR; > > + /* Consume the `?'. */ > > + cp_lexer_consume_token (parser->lexer); > > + /* Look for the matching `:'. */ > > + cp_parser_require (parser, CPP_COLON, RT_COLON); > > + consumed = true; > > + break; > > + > > > > case CPP_OPEN_PAREN: > >{ > > > > /* Consume the `('. */ > > -- > Marek Polacek • Red Hat, Inc. • 300 A St, Boston, MA -- ── Dr. Matthias Kretz https://mattkretz.github.io GSI Helmholtzzentrum für Schwerionenforschung https://gsi.de SIMD easy and portable https://github.com/VcDevel/Vc ──
Re: [PATCH] Fix parser to recognize operator?:
On Fri, Oct 11, 2019 at 04:06:43PM +0200, Matthias Kretz wrote: > This is a minor bugfix for improved error reporting. Overloading ?: is just > as > disallowed as it is without this change. Thanks. Can you provide a testcase that shows why this change makes sense? That testcase then should be part of the patch submission. > 2019-10-11 Matthias Kretz > > * gcc/cp/parser.c (cp_parser_operator): Parse operator?: as an > attempt to overload the conditional operator. Then > grok_op_properties can print its useful "ISO C++ prohibits > overloading operator ?:" message instead of the cryptic error > message about a missing type-specifier before '?' token. > > diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c > index 3ee8da7db94..73385cb3dcb 100644 > --- a/gcc/cp/parser.c > +++ b/gcc/cp/parser.c > @@ -15502,6 +15502,15 @@ cp_parser_operator (cp_parser* parser, location_t > start_loc) >op = COMPONENT_REF; >break; > > +case CPP_QUERY: > + op = COND_EXPR; > + /* Consume the `?'. */ > + cp_lexer_consume_token (parser->lexer); > + /* Look for the matching `:'. */ > + cp_parser_require (parser, CPP_COLON, RT_COLON); > + consumed = true; > + break; > + > case CPP_OPEN_PAREN: >{ > /* Consume the `('. */ -- Marek Polacek • Red Hat, Inc. • 300 A St, Boston, MA