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
+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<=>.
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 `('. */
--- /dev/null
+// { dg-do compile }
+
+struct A {};
+struct B {};
+int operator?:(bool, A, B); // { dg-error "prohibits overloading" }
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" }