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  <m.kretz@gsi.de>

	* parser.c (cp_parser_operator): Parse operator?: as an
	attempt to overload the conditional operator.

From-SVN: r277887
This commit is contained in:
Matthias Kretz 2019-11-06 16:06:08 +00:00 committed by Jason Merrill
parent 4b205bf82d
commit 6394a341d6
4 changed files with 20 additions and 1 deletions

View File

@ -1,3 +1,8 @@
2019-11-06 Matthias Kretz <m.kretz@gsi.de>
* parser.c (cp_parser_operator): Parse operator?: as an
attempt to overload the conditional operator.
2019-11-05 Jason Merrill <jason@redhat.com>
Implement C++20 operator<=>.

View File

@ -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 `('. */

View File

@ -0,0 +1,5 @@
// { dg-do compile }
struct A {};
struct B {};
int operator?:(bool, A, B); // { dg-error "prohibits overloading" }

View File

@ -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" }